22.4. Язык запросов
Пред. | Глава 22. Zend_Search | След.

## 22.4. Язык запросов

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

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

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

### 22.4.1. Элементы

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

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

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

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

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

### 22.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`.

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

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

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

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

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

    "Zend Framework"~10

### 22.4.5. Усиление элемента

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

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

    PHP framework

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

    PHP^4 framework

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

    "PHP framework"^4 "Zend Framework"

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

### 22.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.

#### 22.4.6.1. AND

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

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

    "PHP framework" AND "Zend Framework"

#### 22.4.6.2. OR

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

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

    "PHP framework" OR "Zend Framework"

#### 22.4.6.3. NOT

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

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

    "PHP framework" AND NOT "Zend Framework"

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

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

#### 22.4.6.5. +

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

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

    +Zend Framework

#### 22.4.6.6. -

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

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

    "PHP framework" -"Zend Framework"

#### 22.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`.

### 22.4.7. Групирование

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

    +(framework OR library) +php

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

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

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

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

    title:(+return +"pink panther")

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

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

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

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

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

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

    \(1\+1\)\:2

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

Пред. | Уровень выше | След.
22.3. Поиск по индексу | Начало | 22.5. Типы запросов