Boolean‑операторы в поисковых системах: синтаксис, приоритет и примеры

В любой системе поиска – будь то поисковая строка в Google, запрос к базе данных, фильтр в Elasticsearch или Lucene – Boolean‑операторы (AND, OR, NOT) позволяют комбинировать условия и получать точные результаты. Когда требований к поиску становится больше, простые запросы уже не справляются, и необходимо использовать сложные запросы с несколькими операторами и вложенными скобками.

Основные Boolean‑операторы

  • AND — требует, чтобы оба условия были выполнены.
  • OR — достаточно выполнить хотя бы одно из условий.
  • NOT — исключает документы, содержащие указанный термин.

Во многих системах оператор AND задаётся пробелом, а OR – символом | или словом OR. Для отрицания часто используют - (минус) или слово NOT.

Приоритет операторов и скобки

По умолчанию большинство движков применяют следующий порядок приоритета:

  1. NOT
  2. AND
  3. 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:операторы)

Пошаговый алгоритм построения сложного запроса

  1. Определите цель поиска. Что именно должно быть найдено? Какие документы нужно исключить?
  2. Разбейте задачу на отдельные условия. Запишите их в виде простых запросов.
  3. Группируйте условия, которые логически связаны. Используйте скобки для каждой группы.
  4. Назначьте операторы. Для обязательных условий – AND, для альтернативных – OR, для исключений – NOT.
  5. Проверьте приоритет. Убедитесь, что порядок вычисления соответствует вашему намерению; при необходимости добавьте дополнительные скобки.
  6. Тестируйте запрос. Выполните его в целевой системе, проанализируйте результаты и поправьте, если получены лишние или недостающие документы.

Частые ошибки и как их избежать

  • Забыли скобки; При наличии нескольких 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" }}
 ]
 }
 }
 ]
 }
 }
}

Чек‑лист для проверки готового запроса

  1. Все обязательные условия находятся в AND/must‑группе?
  2. Альтернативные варианты объединены через OR/should?
  3. Исключения корректно оформлены через NOT/must_not?
  4. Для каждой группы использованы скобки (или эквивалентные структуры DSL)?
  5. Фразы заключены в кавычки, а отдельные термины – без них?
  6. Не осталось «висячих» операторов (например, AND без правого условия)?
  7. Запрос протестирован на небольшом наборе данных и возвращает ожидаемый результат?

Составление сложных запросов с несколькими Boolean‑операторами – это навык, который развивается через практику. Главное помнить о приоритете операторов, правильно использовать скобки и всегда проверять запрос на небольшом наборе данных. Следуя описанным выше рекомендациям и используя примеры для разных систем, вы сможете быстро находить нужную информацию, фильтровать огромные массивы данных и повышать эффективность своей работы.

Удачной поисковой практики!