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

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, см. раздел Соединение таблиц.

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"
}

По умолчанию ключевые слова объединяются с помощью оператора ИЛИ. Однако это поведение можно изменить с помощью клаузы "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