27.4. Язык запросов

Java Lucene и Zend_Search_Lucene предоставляют мощный язык запросов.

Он в основном один и тот же, но имеются некоторые различия, которые будут описаны ниже.

Полную документацию по синтаксису запросов для Java Lucene можно найти здесь.

27.4.1. Элементы

Запрос делится на элементы и операторы. Есть следующие типы элементов: одиночный элемент, фразы и подзапросы.

Одиночный элемент – это одно слово, например: "test" или "hello".

Фраза – это группа слов, окруженная двойными кавычками, например: "hello dolly".

Подзапрос – это запрос, окруженный скобками, например: "(hello dolly)".

Несколько элемнтов могут комбинироваться с булевыми операторами для составления более сложных запросов (см. ниже).

27.4.2. Поля

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.

27.4.3. Модификаторы элементов

Lucene поддерживает модификацию элементов запроса для предоставления широкого диапазона опций поиска.

Zend_Search_Lucene сейчас поддерживает модификатор "~" только для фраз [8].

27.4.4. Поиск по критерию близости

Lucene поддерживает поиск слов, находящихся в пределах определенного расстояния друг от друга. Для того, чтобы производить поиск по критерию близости, используйте тильду "~" в конце фразы. Например, для того, чтобы найти в документе "Zend" и "Framework" в пределах 10 слов, используйте следующий запрос:

"Zend Framework"~10

27.4.5. Усиление элемента

Java Lucene и Zend_Search_Lucene предоставляют уровень релевантности соответствующих запросу документов, основыванный на количестве найденных элементов. Для того, чтобы усилить элемент, используйте знак вставки "^" с коэффициентом усиления после этого элемента. Чем больше коэффициент усиления, то тем более релевантным будет элемент.

Усиление элементов позволяет управлять релевантностью документа. Например, если вы ищете

PHP framework

и хотите, чтобы элемент 'PHP' был более релевантным, то усильте его, используя символ ^ с коэффициентом усиления после этого элемента:

PHP^4 framework

Это сделает более релевантными те документы, в которых встречается элемент 'PHP'. Вы можете также усиливать фразы и подзапросы, как в примере ниже:

"PHP framework"^4 "Zend Framework"

По умолчанию коэффициент усиления равен 1. Несмотря на то, что коэффициент усиления должен быть положительным числом, он может быть меньше 1 (например, 0.2).

27.4.6. Булевы операторы

Булевы операторы позволяют комбинировать элементы через логические операторы. 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.

27.4.6.1. AND

Оператор AND означает, что документ должен соответствовать всем элементам в "группе AND".

Для поиск документов, содержащих "PHP framework" м "Zend Framework" используется запрос:

"PHP framework" AND "Zend Framework"

27.4.6.2. OR

Оператор OR делит запрос на несколько необязательных частей.

Для поиска документов, содержащих "PHP framework" или "Zend Framework" используется запрос:

"PHP framework" OR "Zend Framework"

27.4.6.3. NOT

Оператор NOT исключает документы, содержащие элемент после NOT. Но "группа AND", содержащая только элементы с оператором NOT, даст пустой результат вместо всего набора проиндексированных документов.

Для поиска документов, содержащих "PHP framework", но без "Zend Framework", используется запрос:

"PHP framework" AND NOT "Zend Framework"

27.4.6.4. Операторы &&, ||, и !

Операторы &&, ||, и ! могут использоваться вместо AND, OR и NOT.

27.4.6.5. +

"+" означает, что документ должен соответствовать элементу, находящемуся после "+".

Для поиска документов, которые должны содержать "Zend" и могут содержать "Framework", используется запрос:

+Zend Framework

27.4.6.6. -

"-" исключает документы, соответствующие элементу находящемуся после него.

Для поиска документов, содержащих "PHP framework", но без "Zend Framework", используется запрос:

"PHP framework" -"Zend Framework"

27.4.6.7. Отсутствие оператора

Если не не указан оператор, то поведение определяется используемым по умолчанию булевым оператором.

По умолчанию таким оператором является 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.

27.4.7. Групирование

Java Lucene и Zend_Search_Lucene поддерживают использование скобок для группирования условий в подзапросы. Это может быть полезным, если вы хотите контролировать булеву логику для запросов или смешивать различные стили запросов:

+(framework OR library) +php

Zend_Search_Lucene поддердивает подзапросы на любой уровни вложенности.

27.4.8. Группирование полей

Lucene поддерживает использование скобок для группирования нескольких условий применительно к одному полю.

Для поиска заголовка, содержащего слово "return" и фразу "pink panther" используйте запрос:

title:(+return +"pink panther")

Zend_Search_Lucene поддердивает подзапросы любого уровня вложенности.

27.4.9. Экранирование специальных символов

Lucene поддерживает экранирование тех специальных символов, которые являются частью синтаксиса запросов. Список специальных символов:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

+ и - внутри элемента обрабатываются как обычные символы.

Для того, чтобы экранировать эти символы, используйте \ перед символом. Например, для поиска (1+1):2 используйте запрос:

\(1\+1\)\:2



[8] "~" по отношению к элементам используется для нечеткого поиска, но запросы для нечеткого поиска еще не поддерживаются.