Java Lucene и Zend_Search_Lucene предоставляют мощный язык запросов.
Он в основном один и тот же, но имеются некоторые различия, которые будут описаны ниже.
Полную документацию по синтаксису запросов для Java Lucene можно найти здесь.
Запрос делится на элементы и операторы. Есть следующие типы элементов: одиночный элемент, фразы и подзапросы.
Одиночный элемент – это одно слово, например: "test" или "hello".
Фраза – это группа слов, окруженная двойными кавычками, например: "hello dolly".
Подзапрос – это запрос, окруженный скобками, например: "(hello dolly)".
Несколько элемнтов могут комбинироваться с булевыми операторами для составления более сложных запросов (см. ниже).
Lucene поддерживает данные, хранящиеся в полях. Производя поиск, можно указывать поля или использовать поле по умолчанию. Имена полей зависят от проиндексированных данных, а используемое по умолчание поле определяется через текущие настройки.
Первым и важным отличием от Java Lucene является то, что по умолчанию элементы ищутся по всем полям.
В классе Zend_Search_Lucene есть два статических метода, которые позволяют работать с настройками:
<?php $defaultSearchField = Zend_Search_Lucene::getDefaultSearchField(); ... Zend_Search_Lucene::setDefaultSearchField('contents');
Значение null
означает, что поиск производится по всем
полям. Это значение настройки по умолчанию.
Вы можете указать поле, набирая имя поля с двоеточием ":" в конце и затем искомый элемент.
Для примера предположим, что индекс Lucene содержит два поля - 'title' (заголовок) и 'text' (текст), 'text' является полем, используемым по умолчанию. Если вы хотите найти документ с заголовком "The Right Way", который содержит текст "don't go this way", то можете ввести:
title:"The Right Way" AND text:go
или
title:"Do it right" AND go
Если 'text' является полем, используемым по умолчанию, то указание поля не требуется.
Важно: поле действительно только для того элемента, фразы или подзапроса, перед которым он непосредственно стоит. Таким образом, запрос
title:Do it right
будет искать в поле 'title' только "Do". Поиск "it" и "right" будет
производиться в полях, используемых по умолчанию, если установлены
поля по умолчанию, или по всем полям, если вместо поля по умолчанию
установлено null
.
Lucene поддерживает модификацию элементов запроса для предоставления широкого диапазона опций поиска.
Zend_Search_Lucene сейчас поддерживает модификатор "~" только для фраз [8].
Lucene поддерживает поиск слов, находящихся в пределах определенного расстояния друг от друга. Для того, чтобы производить поиск по критерию близости, используйте тильду "~" в конце фразы. Например, для того, чтобы найти в документе "Zend" и "Framework" в пределах 10 слов, используйте следующий запрос:
"Zend Framework"~10
Java Lucene и Zend_Search_Lucene предоставляют уровень релевантности соответствующих запросу документов, основыванный на количестве найденных элементов. Для того, чтобы усилить элемент, используйте знак вставки "^" с коэффициентом усиления после этого элемента. Чем больше коэффициент усиления, то тем более релевантным будет элемент.
Усиление элементов позволяет управлять релевантностью документа. Например, если вы ищете
PHP framework
и хотите, чтобы элемент 'PHP' был более релевантным, то усильте его, используя символ ^ с коэффициентом усиления после этого элемента:
PHP^4 framework
Это сделает более релевантными те документы, в которых встречается элемент 'PHP'. Вы можете также усиливать фразы и подзапросы, как в примере ниже:
"PHP framework"^4 "Zend Framework"
По умолчанию коэффициент усиления равен 1. Несмотря на то, что коэффициент усиления должен быть положительным числом, он может быть меньше 1 (например, 0.2).
Булевы операторы позволяют комбинировать элементы через логические операторы. Lucene поддерживает AND, "+", OR, NOT и "-" как булевы операторы. Java Lucene требует, чтобы все булевы операторы были в верхнем регистре, Zend_Search_Lucene этого не требует.
Операторы AND, OR, NOT и "+", "-" определяют два различных стиля построения запросов. В отличие от Java Lucene, Zend_Search_Lucene не позволяет смешивать оба стиля.
Если используется стиль AND/OR/NOT, то операторы AND/OR должны находиться между всеми элементами запроса. Перед любым элементом может также находиться оператор NOT. Оператор AND имеет более высокий приоритет, чем OR. Этим Zend_Search_Lucene отличается от Java Lucene.
Оператор AND означает, что документ должен соответствовать всем элементам в "группе AND".
Для поиск документов, содержащих "PHP framework" м "Zend Framework" используется запрос:
"PHP framework" AND "Zend Framework"
Оператор OR делит запрос на несколько необязательных частей.
Для поиска документов, содержащих "PHP framework" или "Zend Framework" используется запрос:
"PHP framework" OR "Zend Framework"
Оператор NOT исключает документы, содержащие элемент после NOT. Но "группа AND", содержащая только элементы с оператором NOT, даст пустой результат вместо всего набора проиндексированных документов.
Для поиска документов, содержащих "PHP framework", но без "Zend Framework", используется запрос:
"PHP framework" AND NOT "Zend Framework"
"+" означает, что документ должен соответствовать элементу, находящемуся после "+".
Для поиска документов, которые должны содержать "Zend" и могут содержать "Framework", используется запрос:
+Zend Framework
"-" исключает документы, соответствующие элементу находящемуся после него.
Для поиска документов, содержащих "PHP framework", но без "Zend Framework", используется запрос:
"PHP framework" -"Zend Framework"
Если не не указан оператор, то поведение определяется используемым по умолчанию булевым оператором.
По умолчанию таким оператором является OR
.
Это означает, что данный элемент является необязательным. Он может как присутствовать, так и не присутствовать в документе, но документы с этим элементом имеют более высокий ранг.
Для поиска документов, которые должны содержать "PHP framework" и могут содержать "Zend Framework", используется запрос:
+"PHP framework" "Zend Framework"
Используемые по умолчанию булевы операторы могут быть
установлены или получены с помощью методов
Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)
и Zend_Search_Lucene_Search_QueryParser::getDefaultOperator()
.
Эти методы работают с константами Zend_Search_Lucene_Search_QueryParser::B_AND
и Zend_Search_Lucene_Search_QueryParser::B_OR
.
Java Lucene и Zend_Search_Lucene поддерживают использование скобок для группирования условий в подзапросы. Это может быть полезным, если вы хотите контролировать булеву логику для запросов или смешивать различные стили запросов:
+(framework OR library) +php
Zend_Search_Lucene поддердивает подзапросы на любой уровни вложенности.
Lucene поддерживает использование скобок для группирования нескольких условий применительно к одному полю.
Для поиска заголовка, содержащего слово "return" и фразу "pink panther" используйте запрос:
title:(+return +"pink panther")
Zend_Search_Lucene поддердивает подзапросы любого уровня вложенности.
Lucene поддерживает экранирование тех специальных символов, которые являются частью синтаксиса запросов. Список специальных символов:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
+ и - внутри элемента обрабатываются как обычные символы.
Для того, чтобы экранировать эти символы, используйте \ перед символом. Например, для поиска (1+1):2 используйте запрос:
\(1\+1\)\:2
[8] "~" по отношению к элементам используется для нечеткого поиска, но запросы для нечеткого поиска еще не поддерживаются.