В любой системе поиска – будь то поисковая строка в Google, запрос к базе данных, фильтр в Elasticsearch или Lucene – Boolean‑операторы (AND, OR, NOT) позволяют комбинировать условия и получать точные результаты. Когда требований к поиску становится больше, простые запросы уже не справляются, и необходимо использовать сложные запросы с несколькими операторами и вложенными скобками.
Основные Boolean‑операторы
- AND — требует, чтобы оба условия были выполнены.
- OR — достаточно выполнить хотя бы одно из условий.
- NOT — исключает документы, содержащие указанный термин.
Во многих системах оператор AND задаётся пробелом, а OR – символом | или словом OR. Для отрицания часто используют - (минус) или слово NOT.
Приоритет операторов и скобки
По умолчанию большинство движков применяют следующий порядок приоритета:
- NOT
- AND
- OR
Чтобы изменить порядок вычисления, используйте скобки. Они позволяют явно указать, какие части запроса должны быть обработаны вместе.
Пример приоритета без скобок
apple OR orange AND banana В этом запросе сначала будет выполнено orange AND banana, а затем результат объединится с apple. Если же нам нужно сначала объединить apple OR orange, а потом отфильтровать по banana, следует добавить скобки:
(apple OR orange) AND banana Синтаксис в популярных системах
Поисковые системы (Google, Yandex)
- AND – пробел (по умолчанию). Для явного указания можно писать
AND. - OR – слово
OR(в верхнем регистре). - NOT – минус перед словом:
-termилиNOT term. - Скобки:
( ... ).
Пример:
(site:example.com OR site:example.org) AND "техническая документация" -pdf SQL (PostgreSQL, MySQL)
В SQL Boolean‑операторы пишутся полностью:
SELECT *
FROM articles
WHERE ( ILIKE '%база%' OR content ILIKE '%запрос%')
AND published = TRUE
AND NOT (author = 'admin'); Elasticsearch (DSL)
В Elasticsearch запросы формируются в виде JSON‑объектов. Для сложных условий используют bool‑клаузы:
{
"query": {
"bool": {
"must": [
{ "match": { "": "поиск" }},
{ "range": { "date": { "gte": "2025-01-01" }}}
],
"should": [
{ "match": { "tags": "boolean" }},
{ "match": { "tags": "операторы" }}
], "must_not": [
{ "term": { "status": "archived" }}
]
}
}
}
Здесь:
- must — аналог
AND(все условия должны выполниться). - should — аналог
OR(хотя бы одно из условий). - must_not — аналог
NOT.
Lucene Query Syntax
+(:"поиск" AND date:[2025-01-01 TO *])
-(status:archived)
(tags:boolean OR tags:операторы) Пошаговый алгоритм построения сложного запроса
- Определите цель поиска. Что именно должно быть найдено? Какие документы нужно исключить?
- Разбейте задачу на отдельные условия. Запишите их в виде простых запросов.
- Группируйте условия, которые логически связаны. Используйте скобки для каждой группы.
- Назначьте операторы. Для обязательных условий –
AND, для альтернативных –OR, для исключений –NOT. - Проверьте приоритет. Убедитесь, что порядок вычисления соответствует вашему намерению; при необходимости добавьте дополнительные скобки.
- Тестируйте запрос. Выполните его в целевой системе, проанализируйте результаты и поправьте, если получены лишние или недостающие документы.
Частые ошибки и как их избежать
- Забыли скобки; При наличии нескольких
ORиANDбез скобок система может интерпретировать запрос иначе, чем вы ожидали. - Неправильный порядок NOT. Оператор
NOTобычно применяется только к следующему термину. Чтобы исключить целую группу, используйте скобки:NOT (A OR B). - Перепутали кавычки. Фразы с пробелами должны быть в двойных кавычках, иначе каждый отдельный термин будет трактоваться как отдельный запрос.
- Слишком широкие OR‑группы. Если в
OR‑группе попадают термины, которые почти всегда встречаются, запрос может вернуть огромный набор данных, замедляя работу. - Не учитывали регистр и морфологию. В некоторых системах (например, в SQL) поиск чувствителен к регистру, в других – нет. Проверьте настройки.
Лучшие практики
- Явно указывайте операторы. Не полагайтесь на «по умолчанию», особенно в сложных запросах.
- Комментируйте запросы. В DSL‑языках (SQL, Elasticsearch) добавляйте комментарии, чтобы позже было понятно, зачем использована та или иная группа.
- Ограничивайте диапазоны. При работе с датами и числами используйте диапазоны (
BETWEEN,range) вместо открытых условий. - Тестируйте на небольшом наборе. Сначала проверяйте запрос на небольшом подмножестве данных, а затем масштабируйте.
- Документируйте часто используемые шаблоны. Создайте библиотеку «запросных шаблонов», которые можно быстро адаптировать.
Пример комплексного запроса в разных системах
Поисковый запрос в Google
(site:example.com OR site:example.org)
AND ("техническая документация" OR "руководство пользователя")
-pdf
-site:blog.example.com SQL‑запрос к таблице documents
SELECT *
FROM documents
WHERE ( ILIKE '%техническая%' OR content ILIKE '%руководство%')
AND published_at >= '2025-01-01'
AND NOT (file_type = 'pdf')
AND NOT (source LIKE 'blog.%'); Elasticsearch DSL
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{ "match_phrase": { "": "техническая документация" }},
{ "match_phrase": { "": "руководство пользователя" }}
]
}
},
{ "range": { "published_at": { "gte": "2025-01-01" }}}
],
"must_not": [
{ "term": { "file_type": "pdf" }},
{ "wildcard": { "source": "blog.*" }}
],
"filter": [
{
"bool": {
"should": [
{ "term": { "site": "example.com" }},
{ "term": { "site": "example.org" }}
]
}
}
]
}
}
}
Чек‑лист для проверки готового запроса
- Все обязательные условия находятся в
AND/must‑группе? - Альтернативные варианты объединены через
OR/should? - Исключения корректно оформлены через
NOT/must_not? - Для каждой группы использованы скобки (или эквивалентные структуры DSL)?
- Фразы заключены в кавычки, а отдельные термины – без них?
- Не осталось «висячих» операторов (например,
ANDбез правого условия)? - Запрос протестирован на небольшом наборе данных и возвращает ожидаемый результат?
Составление сложных запросов с несколькими Boolean‑операторами – это навык, который развивается через практику. Главное помнить о приоритете операторов, правильно использовать скобки и всегда проверять запрос на небольшом наборе данных. Следуя описанным выше рекомендациям и используя примеры для разных систем, вы сможете быстро находить нужную информацию, фильтровать огромные массивы данных и повышать эффективность своей работы.
Удачной поисковой практики!