Функции полнотекстового поиска
Функции поиска должны использоваться при выполнении полнотекстового поиска, а именно при использовании предикатов MATCH или QUERY. Вне так называемого контекста поиска эти функции возвращают значения по умолчанию, такие как 0 или NULL.
Elasticsearch SQL оптимизирует все запросы, выполняемые к Elasticsearch, в зависимости от потребностей ранжирования. Используя track_scores в запросе на поиск или _doc сортировку, которая отключает вычисление баллов, Elasticsearch SQL указывает Elasticsearch не вычислять баллы, если они не нужны. Например, каждый раз, когда встречается функция SCORE() в SQL-запросе, баллы вычисляются.
MATCH
Синопсис:
MATCH(
field_exp,
constant_exp
[, options]) Входные данные:
| поле(я) для сопоставления | |
| текст для сопоставления | |
| дополнительные параметры; необязательно |
Описание: Вариант полнотекстового поиска в виде предиката, доступный в Elasticsearch SQL, который предоставляет пользователю контроль над мощными запросами Elasticsearch match и multi_match.
Первый параметр — это поле или поля для сопоставления. Если он получает только одно значение, Elasticsearch SQL будет использовать запрос match для выполнения поиска:
SELECT author, name FROM library WHERE MATCH(author, 'frank');
author | name
---------------+-------------------
Frank Herbert |Dune
Frank Herbert |Dune Messiah
Frank Herbert |Children of Dune
Frank Herbert |God Emperor of Dune Однако он также может получать список полей и соответствующих необязательных значений boost. В этом случае Elasticsearch SQL будет использовать запрос multi_match для сопоставления документов:
SELECT author, name, SCORE() FROM library WHERE MATCH('author^2,name^5', 'frank dune');
author | name | SCORE()
---------------+-------------------+---------------
Frank Herbert |Dune |11.443176
Frank Herbert |Dune Messiah |9.446629
Frank Herbert |Children of Dune |8.043278
Frank Herbert |God Emperor of Dune|7.0029488 Запрос multi_match в Elasticsearch имеет возможность усиления по полям, которая предоставляет приоритетное значение (с точки зрения ранжирования) полям, по которым ведется поиск, используя символ ^. В примере выше поле name имеет большее значение в итоговом балле по сравнению с полем author при поиске текста frank dune в обоих полях.
Оба варианта выше могут быть использованы в сочетании с необязательным третьим параметром предиката MATCH(), где можно указать дополнительные параметры конфигурации (разделенные точкой с запятой ;) для запросов match или multi_match. Например:
SELECT author, name, SCORE() FROM library WHERE MATCH(name, 'to the star', 'operator=OR;fuzziness=AUTO:1,5;minimum_should_match=1')
ORDER BY SCORE() DESC LIMIT 2;
author | name | SCORE()
-----------------+------------------------------------+---------------
Douglas Adams |The Hitchhiker's Guide to the Galaxy|3.1756816
Peter F. Hamilton|Pandora's Star |3.0997515 Разрешенные необязательные параметры для варианта с одним полем MATCH() (для запроса Elasticsearch match) — это: analyzer, auto_generate_synonyms_phrase_query, lenient, fuzziness, fuzzy_transpositions, fuzzy_rewrite, minimum_should_match, operator, max_expansions, prefix_length.
Разрешенные необязательные параметры для варианта с несколькими полями MATCH() (для запроса Elasticsearch multi_match) — это: analyzer, auto_generate_synonyms_phrase_query, lenient, fuzziness, fuzzy_transpositions, fuzzy_rewrite, minimum_should_match, operator, max_expansions, prefix_length, slop, tie_breaker, type.
QUERY
Синопсис:
QUERY(
constant_exp
[, options]) Входные данные:
| текст запроса | |
| дополнительные параметры; необязательно |
Описание: Так же как и MATCH, QUERY — это предикат полнотекстового поиска, который предоставляет пользователю контроль над запросом query_string в Elasticsearch.
Первый параметр — это входные данные, которые будут переданы непосредственно запросу query_string, что означает, что все, что query_string принимает в поле query, также может быть использовано здесь:
SELECT author, name, SCORE() FROM library WHERE QUERY('name:dune');
author | name | SCORE()
---------------+-------------------+---------------
Frank Herbert |Dune |2.2886353
Frank Herbert |Dune Messiah |1.8893257
Frank Herbert |Children of Dune |1.6086556
Frank Herbert |God Emperor of Dune|1.4005898 Более сложный пример, показывающий больше возможностей, которые поддерживает query_string, конечно, возможен с помощью Elasticsearch SQL:
SELECT author, name, page_count, SCORE() FROM library WHERE QUERY('_exists_:"author" AND page_count:>200 AND (name:/star.*/ OR name:duna~)');
author | name | page_count | SCORE()
------------------+-------------------+---------------+---------------
Frank Herbert |Dune |604 |3.7164764
Frank Herbert |Dune Messiah |331 |3.4169943
Frank Herbert |Children of Dune |408 |3.2064917
Frank Herbert |God Emperor of Dune|454 |3.0504425
Peter F. Hamilton |Pandora's Star |768 |3.0
Robert A. Heinlein|Starship Troopers |335 |3.0 В приведенном выше запросе используется запрос _exists_ для выбора документов, имеющих значения в поле author, диапазонный запрос для page_count и запросы на регулярные выражения и размытие для поля name.
Если требуется настроить различные параметры конфигурации, которые предоставляет query_string, это можно сделать, используя второй необязательный параметр. Несколько настроек можно указать, разделяя их точкой с запятой ;:
SELECT author, name, SCORE() FROM library WHERE QUERY('dune god', 'default_operator=and;default_field=name');
author | name | SCORE()
---------------+-------------------+---------------
Frank Herbert |God Emperor of Dune|3.6984892 Разрешенные необязательные параметры для QUERY(): allow_leading_wildcard, analyze_wildcard, analyzer, auto_generate_synonyms_phrase_query, default_field, default_operator, enable_position_increments, escape, fuzziness, fuzzy_max_expansions, fuzzy_prefix_length, fuzzy_rewrite, fuzzy_transpositions, lenient, max_determinized_states, minimum_should_match, phrase_slop, rewrite, quote_analyzer, quote_field_suffix, tie_breaker, time_zone, type.
SCORE
Синопсис:
SCORE()
Входные данные: нет
Выходные данные: double числовое значение
Описание: Возвращает релевантность заданного входного значения для выполненного запроса. Чем выше балл, тем более релевантны данные.
При выполнении нескольких текстовых запросов в предложении WHERE их баллы комбинируются по тем же правилам, что и в запросе bool Elasticsearch bool query.
Обычно SCORE используется для упорядочивания результатов запроса на основе их релевантности:
SELECT SCORE(), * FROM library WHERE MATCH(name, 'dune') ORDER BY SCORE() DESC;
SCORE() | author | name | page_count | release_date
---------------+---------------+-------------------+---------------+--------------------
2.2886353 |Frank Herbert |Dune |604 |1965-06-01T00:00:00Z
1.8893257 |Frank Herbert |Dune Messiah |331 |1969-10-15T00:00:00Z
1.6086556 |Frank Herbert |Children of Dune |408 |1976-04-21T00:00:00Z
1.4005898 |Frank Herbert |God Emperor of Dune|454 |1981-05-28T00:00:00Z Однако вполне допустимо возвращать балл без сортировки по нему:
SELECT SCORE() AS score, name, release_date FROM library WHERE QUERY('dune') ORDER BY YEAR(release_date) DESC;
score | name | release_date
---------------+-------------------+--------------------
1.4005898 |God Emperor of Dune|1981-05-28T00:00:00Z
1.6086556 |Children of Dune |1976-04-21T00:00:00Z
1.8893257 |Dune Messiah |1969-10-15T00:00:00Z
2.2886353 |Dune |1965-06-01T00:00:00Z
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/sql-functions-search.html