≫ Полнотекстовое сопоставление

MATCH

Клауза MATCH позволяет выполнять полнотекстовый поиск в текстовых полях. Входная строка запроса токенизируется с использованием тех же настроек, которые применялись к тексту при индексировании. Помимо токенизации входного текста, строка запроса поддерживает ряд операторов полнотекстового поиска, которые задают различные правила того, как ключевые слова должны обеспечивать валидное совпадение.

Клаузы полнотекстового поиска могут комбинироваться с атрибутными фильтрами как логическое И. Логические ИЛИ между полнотекстовыми совпадениями и атрибутными фильтрами не поддерживаются.

Запрос с match всегда выполняется первым в процессе фильтрации, за ним следуют атрибутные фильтры. Атрибутные фильтры применяются к результату запроса match. Запрос без клаузы match называется fullscan.

В SELECT должно быть не более одного MATCH().

Используя синтаксис полнотекстового запроса, поиск выполняется по всем индексированным текстовым полям документа, если выражение не требует совпадения внутри поля (например, поиск фразы) или не ограничено операторами поля.

При использовании запросов с JOIN, MATCH() может принимать необязательный второй параметр, который указывает, к какой таблице должен применяться полнотекстовый поиск. По умолчанию полнотекстовый запрос применяется к левой таблице в операции JOIN:

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id WHERE MATCH('search query', table2);

Это позволяет выполнять полнотекстовый поиск по конкретным таблицам в операции соединения. Для получения дополнительной информации о использовании MATCH с JOIN смотрите раздел Joining tables.

SQL

MATCH('search query' [, table_name])
  • 'search query': Строка полнотекстового поискового запроса, которая может включать различные операторы полнотекстового поиска.
  • table_name: (Опционально) Имя таблицы, к которой применяется полнотекстовый поиск, используется в запросах с JOIN для указания таблицы, отличной от левой по умолчанию.

Оператор SELECT использует клаузу MATCH, которая должна идти после WHERE, для выполнения полнотекстового поиска. MATCH() принимает входную строку, в которой доступны все операторы полнотекстового поиска.

‹›
  • SQL
  • MATCH with filters
📋
SELECT * FROM myindex WHERE MATCH('"find me fast"/2');
‹›
Response
+------+------+----------------+
| id   | gid  | title          |
+------+------+----------------+
|    1 |   11 | first find me  |
|    2 |   12 | second find me |
+------+------+----------------+
2 rows in set (0.00 sec)

HTTP JSON

Полнотекстовый поиск доступен в эндпоинте /search и в HTTP-клиентах. Для выполнения полнотекстового поиска можно использовать следующие клаузы:

match

"match" — это простой запрос, который ищет указанные ключевые слова в указанных полях.

"query":
{
  "match": { "field": "keyword" }
}

Вы можете указать список полей:

"match":
{
  "field1,field2": "keyword"
}

Или использовать _all или * для поиска по всем полям.

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

"match":
{
  "!field1": "keyword"
}

По умолчанию ключевые слова объединяются оператором OR. Однако вы можете изменить это поведение с помощью клаузы "operator":

"query":
{
  "match":
  {
    "content,title":
    {
      "query":"keyword",
      "operator":"or"
    }
  }
}

"operator" может быть установлен в "or" или "and".

Также можно применить модификатор boost. Он повышает значение IDF_score слова на указанный коэффициент в рейтинговых оценках, которые учитывают IDF в своих вычислениях. Это не влияет на процесс сопоставления.

"query":
{
  "match":
  {
    "field1":
    {
      "query": "keyword",
      "boost": 2.0
    }
  }
}

match_phrase

"match_phrase" — это запрос, который ищет полную фразу. Он похож на оператор фразы в SQL. Пример:

"query":
{
  "match_phrase": { "_all" : "had grown quite" }
}

query_string

"query_string" принимает входную строку в синтаксисе MATCH() для полнотекстового запроса.

"query":
{
  "query_string": "Church NOTNEAR/3 street"
}

match_all

"match_all" принимает пустой объект и возвращает документы из таблицы без применения атрибутных фильтров или полнотекстового поиска. Альтернативно, можно просто опустить клаузу query в запросе, что даст тот же эффект.

"query":
{
  "match_all": {}
}

Комбинирование полнотекстовой фильтрации с другими фильтрами

Все клаузы полнотекстового поиска могут комбинироваться с операторами must, must_not и should в JSON bool запросе.

‹›
  • match
  • match_phrase
  • query_string
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
POST /search
-d
'{
    "table" : "hn_small",
    "query":
    {
        "match":
        {
            "*" : "find joe"
        }
    },
    "_source": ["story_author","comment_author"],
    "limit": 1
}'
‹›
Response
{
   "took" : 3,
   "timed_out" : false,
   "hits" : {
      "hits" : [
         {
            "_id": 668018,
            "_score" : 3579,
            "_source" : {
               "story_author" : "IgorPartola",
               "comment_author" : "joe_the_user"
            }
         }
      ],
      "total" : 88063,
      "total_relation" : "eq"
   }
}
Last modified: August 28, 2025