Beispiel #1
0
 /**
  * Пытается убрать кавычки из запроса
  * @param nc_search_language_corrector_phrase $phrase
  * @return boolean
  */
 public function correct(nc_search_language_corrector_phrase $phrase)
 {
     if (!nc_search::should('RemovePhrasesOnEmptyResult')) {
         return false;
     }
     $orignal_phrase_text = $phrase_text = $phrase->to_string();
     if (strpos($phrase_text, '"') !== false && !preg_match('/"\\S+"/u', $phrase_text)) {
         $phrase_text = preg_replace('/"~[\\d\\.]+/', '"', $phrase_text);
         // remove distance search
         if (nc_search_util::is_boolean_query($phrase_text) || preg_match('/[-+]/', $phrase_text)) {
             // there is a a phrase with several words!
             $phrase_text = preg_replace('/"(\\S)/u', "(\$1", $phrase_text);
             $phrase_text = str_replace('"', ")", $phrase_text);
         } else {
             $phrase_text = str_replace('"', "", $phrase_text);
         }
         $message = sprintf(NETCAT_MODULE_SEARCH_CORRECTION_QUOTES, $orignal_phrase_text, $phrase_text);
         $phrase->set_phrase($phrase_text, $message);
         return true;
     }
     return false;
 }
Beispiel #2
0
 /**
  * Вспомогательный метод для составления запроса из нескольких полей
  * (поле «исключить страницы, на которых встречаются слова...»)
  */
 public function make_query_string($query, $exclude = false)
 {
     $query = (string) $query;
     if ($exclude && ($exclude = trim((string) $exclude))) {
         $not_op = nc_search_util::is_boolean_query($query) || nc_search_util::is_boolean_query($exclude) ? "AND NOT " : "-";
         if (strpos($exclude, " ")) {
             $exclude = "({$exclude})";
         }
         if (strpos($query, " ")) {
             $query = "({$query})";
         }
         $query = "{$query} {$not_op}{$exclude}";
     }
     return $query;
 }
Beispiel #3
0
 /**
  * Трансформация запроса nc_search_query в запрос Lucene
  * @param nc_search_query $query
  * @return Zend_Search_Lucene_Search_Query
  */
 protected function get_lucene_query(nc_search_query $query)
 {
     Zend_Search_Lucene_Search_QueryParser::suppressQueryParsingExceptions();
     if ($this->get_setting('DefaultBooleanOperator') == 'AND') {
         Zend_Search_Lucene_Search_QueryParser::setDefaultOperator(Zend_Search_Lucene_Search_QueryParser::B_AND);
     }
     $query_string = $query->to_string();
     // range search for integers
     if (nc_search::should('AllowRangeSearch') && strpos($query_string, ' TO ')) {
         preg_match_all("/(\\[|\\{)\\s*(\\d+)\\s+TO\\s+(\\d+)\\s*(\\]|\\})/", $query_string, $matches, PREG_SET_ORDER);
         foreach ($matches as $m) {
             $query_string = str_replace($m[0], $m[1] . $this->pad_integer($m[2]) . " TO " . $this->pad_integer($m[3]) . $m[4], $query_string);
         }
     }
     // add a time range should it be required
     $modified_after = $query->get('modified_after');
     $modified_before = $query->get('modified_before');
     if ($modified_before || $modified_after) {
         $modified_after = $modified_after ? strftime("%Y%m%d%H%M%S", strtotime($modified_after)) : "19000101000000";
         $modified_before = $modified_before ? strftime("%Y%m%d%H%M%S", strtotime($modified_before)) : "22000101000000";
         $query_string = "({$query_string}) last_modified:[{$modified_after} TO {$modified_before}]";
     }
     // add area
     $area = $query->get('area');
     if ($area) {
         if (!$area instanceof nc_search_area) {
             $area = new nc_search_area($area);
         }
         $is_boolean = nc_search_util::is_boolean_query($query_string);
         $query_string = "({$query_string}) " . ($is_boolean ? " AND " : "+") . $area->get_field_condition($is_boolean);
     }
     // parse string into Lucene Query
     $zend_query = Zend_Search_Lucene_Search_QueryParser::parse($query_string, 'UTF-8');
     return $zend_query;
 }