Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›SQL ›Функции и операторы

Функции полнотекстового поиска

Функции поиска должны использоваться при выполнении полнотекстового поиска, а именно при использовании предикатов 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;cutoff_frequency=0.2');

     author      |                name                |    SCORE()
-----------------+------------------------------------+---------------
Peter F. Hamilton|Pandora's Star                      |3.0997515
Douglas Adams    |The Hitchhiker's Guide to the Galaxy|3.1756816

В более сложном примере выше, параметр cutoff_frequency позволяет указать абсолютную или относительную частоту документов, где термины с высокой частотой перемещаются в необязательный подзапрос и оцениваются только в том случае, если один из терминов с низкой частотой (ниже порогового значения) в случае оператора or или все термины с низкой частотой в случае оператора and совпадают. Подробнее об этом можно узнать на странице Пороговая частота.

Допустимые необязательные параметры для варианта с одним полем MATCH() (для запроса Elasticsearch match): analyzer, auto_generate_synonyms_phrase_query, cutoff_frequency, lenient, fuzziness, fuzzy_transpositions, fuzzy_rewrite, minimum_should_match, operator, max_expansions, prefix_length.

Допустимые необязательные параметры для варианта с несколькими полями MATCH() (для запроса Elasticsearch multi_match): analyzer, auto_generate_synonyms_phrase_query, cutoff_frequency, 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 их оценки будут объединены по тем же правилам, что и в булевом запросе Elasticsearch.

Обычно 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/7.17/sql-functions-search.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API