Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Отображение ›Типы данных поля

Тип поля для поиска по мере ввода

Тип поля search_as_you_type — это текстовое поле, оптимизированное для предоставления поддержки поиска по мере ввода. Оно создаёт ряд подполей, которые анализируются для индексирования терминов, которые могут эффективно сопоставляться запросом, частично соответствующим всему индексированному текстовому значению. Поддерживаются как полнотекстовый поиск по префиксам (т. е. сопоставление терминов, начинающихся с начала ввода), так и поиск по инфиксам (т. е. сопоставление терминов в любой позиции ввода).

При добавлении поля этого типа в отображение

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "search_as_you_type"
      }
    }
  }
}

Это создаёт следующие поля:

my_field

Анализируется в соответствии с настройками отображения. Если анализатор не задан, используется анализатор по умолчанию для индекса

my_field._2gram

Оборачивает анализатор my_field с фильтром токенов shingle размером 2

my_field._3gram

Оборачивает анализатор my_field с фильтром токенов shingle размером 3

my_field._index_prefix

Оборачивает анализатор my_field._3gram с фильтром токенов edge ngram

Размер шинглов в подполях можно настроить с помощью параметра отображения max_shingle_size. Значение по умолчанию — 3, и допустимые значения этого параметра — целые числа от 2 до 4 включительно. Подполя shingle создаются для каждого размера шингла от 2 до и включая max_shingle_size. Подполе my_field._index_prefix всегда использует анализатор из подполя shingle с max_shingle_size при построении собственного анализатора.

Увеличение размера max_shingle_size улучшит соответствие запросам с большим количеством последовательных терминов, но при этом увеличит размер индекса. Значение по умолчанию max_shingle_size обычно достаточно.

Один и тот же ввод индексируется в каждое из этих полей автоматически с их различными цепочками анализа, когда индексированный документ имеет значение для корневого поля my_field.

PUT my-index-000001/_doc/1?refresh
{
  "my_field": "quick brown fox jump lazy dog"
}

Наиболее эффективным способом запроса для использования в сценарии поиска по мере ввода обычно является запрос multi_match типа bool_prefix, который нацелен на корневое поле search_as_you_type и его подполя shingle. Это может сопоставлять термины запроса в любом порядке, но присваивает документ более высокую оценку, если он содержит термины в порядке в подполе shingle.

GET my-index-000001/_search
{
  "query": {
    "multi_match": {
      "query": "brown f",
      "type": "bool_prefix",
      "fields": [
        "my_field",
        "my_field._2gram",
        "my_field._3gram"
      ]
    }
  }
}
{
  "took" : 44,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "my_field" : "quick brown fox jump lazy dog"
        }
      }
    ]
  }
}

Для поиска документов, которые строго соответствуют терминам запроса в порядке, или для поиска с использованием других свойств запросов по фразе, используйте запрос match_phrase_prefix на корневом поле. Также можно использовать match_phrase запрос, если последний термин должен точно совпадать, а не как префикс. Использование запросов по фразе может быть менее эффективным, чем использование запроса match_bool_prefix.

GET my-index-000001/_search
{
  "query": {
    "match_phrase_prefix": {
      "my_field": "brown f"
    }
  }
}

Параметры, специфичные для поля search_as_you_type

В отображении для поля search_as_you_type принимаются следующие параметры, специфичные для этого типа поля:

max_shingle_size

(Необязательно, целое число) Наибольший размер шингла для создания. Допустимые значения — от 2 (включительно) до 4 (включительно). По умолчанию — 3.

Подполе создаётся для каждого целого числа между 2 и этим значением. Например, значение 3 создаёт два подполя: my_field._2gram и my_field._3gram

Больше подполей позволяет создавать более специфические запросы, но увеличивает размер индекса.

Параметры типа поля как текстового поля

В отображении для поля search_as_you_type принимаются следующие параметры из-за его природы как текстового поля, и их поведение аналогично поведению при настройке поля типа text. Если не указано иное, эти параметры настраивают подполя корневого поля аналогичным образом.

analyzer
Анализатор, который следует использовать для полей text, как при индексировании, так и при поиске (если не переопределено с помощью search_analyzer). По умолчанию используется анализатор по умолчанию для индекса или анализатор standard.
index
Поле должно быть поисковым? Принимает значения true (по умолчанию) или false.
index_options
Какая информация должна храниться в индексе для целей поиска и выделения. По умолчанию — positions.
norms
Следует ли учитывать длину поля при оценке запросов. Принимает значения true или false. Этот параметр настраивает корневое поле и подполя shingle, где его значение по умолчанию — true. Он не настраивает подполе prefix, где оно — false.
store
Следует ли хранить значение поля и извлекать его отдельно от поля _source. Принимает значения true или false (по умолчанию). Этот параметр настраивает только корневое поле и не настраивает подполя.
search_analyzer
Анализатор analyzer, который следует использовать при поиске для полей text. По умолчанию используется значение analyzer.
search_quote_analyzer
Анализатор analyzer, который следует использовать при поиске, когда встречается фраза. По умолчанию используется значение search_analyzer.
similarity
Какой алгоритм оценки или сходства следует использовать. По умолчанию — BM25.
term_vector
Следует ли хранить векторы терминов для поля. По умолчанию — no. Этот параметр настраивает корневое поле и подполя shingle, но не подполе prefix.

Оптимизация запросов по префиксам

При выполнении запроса prefix к корневому полю или любому из его подполей запрос будет переписан в запрос term на подполе ._index_prefix. Это сопоставляет более эффективно, чем обычно для запросов prefix по текстовым полям, поскольку префиксы до определённой длины каждого шингла индексируются непосредственно как термины в подполе ._index_prefix.

Анализатор подполя ._index_prefix немного изменяет поведение построения шинглов, чтобы также индексировать префиксы терминов в конце значения поля, которые обычно не генерируются как шинглы. Например, если значение quick brown fox индексируется в поле search_as_you_type с значением max_shingle_size 3, префиксы для brown fox и fox также индексируются в подполе ._index_prefix, даже если они не появляются как термины в подполе ._3gram. Это позволяет завершать все термины ввода поля.

© 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/search-as-you-type.html

Spec-Zone.ru

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