Тип поля для поиска по мере ввода
Тип поля search_as_you_type — это текстовое поле, оптимизированное для предоставления поддержки поиска по мере ввода. Оно создаёт ряд подполей, которые анализируются для индексирования терминов, которые могут эффективно сопоставляться запросом, частично соответствующим всему индексированному текстовому значению. Поддерживаются как полнотекстовый поиск по префиксам (т. е. сопоставление терминов, начинающихся с начала ввода), так и поиск по инфиксам (т. е. сопоставление терминов в любой позиции ввода).
При добавлении поля этого типа в отображение
PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
}
} Это создаёт следующие поля:
| | Анализируется в соответствии с настройками отображения. Если анализатор не задан, используется анализатор по умолчанию для индекса |
| | Оборачивает анализатор |
| | Оборачивает анализатор |
| | Оборачивает анализатор |
Размер шинглов в подполях можно настроить с помощью параметра отображения 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