Язык запросов
Java Lucene и Zend_Search_Lucene предоставляют мощный язык запросов.
Он в основном один и тот же, но имеются некоторые различия, которые
будут описаны ниже.
Полную документацию по синтаксису запросов для Java Lucene можно найти
здесь.
Элементы
Запрос делится на элементы и операторы. Есть следующие типы
элементов: одиночный элемент, фразы и подзапросы.
Одиночный элемент – это одно слово, например: "test" или "hello".
Фраза – это группа слов, окруженная двойными кавычками, например:
"hello dolly".
Подзапрос – это запрос, окруженный скобками, например: "(hello
dolly)".
Несколько элемнтов могут комбинироваться с булевыми операторами для
составления более сложных запросов (см. ниже).
Поля
Lucene поддерживает данные, хранящиеся в полях. Производя поиск,
можно указывать поля или использовать поле по умолчанию. Имена полей
зависят от проиндексированных данных, а используемое по умолчание
поле определяется через текущие настройки.
Первым и важным отличием от Java Lucene является то, что
по умолчанию элементы ищутся по всем полям.
В классе Zend_Search_Lucene есть два статических метода, которые
позволяют работать с настройками:
Значение NULL означает, что поиск производится по всем
полям. Это значение настройки по умолчанию.
Вы можете указать поле, набирая имя поля с двоеточием ":" в конце
и затем искомый элемент.
Для примера предположим, что индекс Lucene содержит два поля -
'title' (заголовок) и 'text' (текст), 'text' является полем,
используемым по умолчанию. Если вы хотите найти документ с
заголовком "The Right Way", который содержит текст "don't go
this way", то можете ввести:
или
Если 'text' является полем, используемым по умолчанию, то указание
поля не требуется.
Важно: поле действительно только для того элемента, фразы или
подзапроса, перед которым он непосредственно стоит. Таким образом,
запрос
будет искать в поле 'title' только "Do". Поиск "it" и "right" будет
производиться в полях, используемых по умолчанию, если установлены
поля по умолчанию, или по всем полям, если вместо поля по умолчанию
установлено NULL.
Модификаторы элементов
Lucene поддерживает модификацию элементов запроса для предоставления
широкого диапазона опций поиска.
Zend_Search_Lucene сейчас поддерживает модификатор "~" только для
фраз
"~" по отношению к элементам используется для нечеткого
поиска, но запросы для нечеткого поиска еще не
поддерживаются.
.
Поиск по критерию близости
Lucene поддерживает поиск слов, находящихся в пределах определенного
расстояния друг от друга. Для того, чтобы производить поиск по
критерию близости, используйте тильду "~" в конце фразы. Например,
для того, чтобы найти в документе "Zend" и "Framework" в пределах
10 слов, используйте следующий запрос:
Усиление элемента
Java Lucene и Zend_Search_Lucene предоставляют уровень релевантности
соответствующих запросу документов, основыванный на количестве
найденных элементов. Для того, чтобы усилить элемент, используйте
знак вставки "^" с коэффициентом усиления после этого элемента. Чем
больше коэффициент усиления, то тем более релевантным будет элемент.
Усиление элементов позволяет управлять релевантностью документа.
Например, если вы ищете
и хотите, чтобы элемент 'PHP' был более релевантным, то усильте
его, используя символ ^ с коэффициентом усиления после этого
элемента:
Это сделает более релевантными те документы, в которых встречается
элемент 'PHP'. Вы можете также усиливать фразы и подзапросы, как в
примере ниже:
По умолчанию коэффициент усиления равен 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 означает, что документ должен соответствовать всем
элементам в "группе AND".
Для поиск документов, содержащих "PHP framework" м "Zend
Framework" используется запрос:
OR
Оператор OR делит запрос на несколько необязательных частей.
Для поиска документов, содержащих "PHP framework" или "Zend
Framework" используется запрос:
NOT
Оператор NOT исключает документы, содержащие элемент после NOT.
Но "группа AND", содержащая только элементы с оператором NOT,
даст пустой результат вместо всего набора проиндексированных
документов.
Для поиска документов, содержащих "PHP framework", но без "Zend
Framework", используется запрос:
Операторы &&, ||, и !
Операторы &&, ||, и ! могут использоваться вместо AND,
OR и NOT.
+
"+" означает, что документ должен соответствовать элементу,
находящемуся после "+".
Для поиска документов, которые должны содержать "Zend" и могут
содержать "Framework", используется запрос:
-
"-" исключает документы, соответствующие элементу находящемуся
после него.
Для поиска документов, содержащих "PHP framework",
но без "Zend Framework", используется запрос:
Отсутствие оператора
Если не не указан оператор, то поведение определяется
используемым по умолчанию булевым оператором.
По умолчанию таким оператором является OR.
Это означает, что данный элемент является необязательным. Он
может как присутствовать, так и не присутствовать в документе,
но документы с этим элементом имеют более высокий ранг.
Для поиска документов, которые должны содержать "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 поддерживают использование
скобок для группирования условий в подзапросы. Это может быть
полезным, если вы хотите контролировать булеву логику для запросов
или смешивать различные стили запросов:
Zend_Search_Lucene поддердивает подзапросы на любой уровни
вложенности.
Группирование полей
Lucene поддерживает использование скобок для группирования
нескольких условий применительно к одному полю.
Для поиска заголовка, содержащего слово "return" и фразу "pink
panther" используйте запрос:
Zend_Search_Lucene поддердивает подзапросы любого уровня
вложенности.
Экранирование специальных символов
Lucene поддерживает экранирование тех специальных символов, которые
являются частью синтаксиса запросов. Список специальных символов:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
+ и - внутри элемента обрабатываются как обычные символы.
Для того, чтобы экранировать эти символы, используйте \ перед
символом. Например, для поиска (1+1):2 используйте запрос: