/** * Трансформация запроса 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; }