Тип поля поиска по мере ввода
Тип поля search_as_you_type — это текстовое поле, оптимизированное для предоставления готовой поддержки запросов, используемых в сценариях поиска по мере ввода. Оно создает ряд подполей, которые анализируются для индексирования терминов, которые могут быть эффективно сопоставлены запросом, частично совпадающим со значением всего индексированного текста. Поддерживаются как завершение по префиксу (т. е. сопоставление терминов, начинающихся с начала входных данных), так и завершение по инфиксу (т. е. сопоставление терминов в любой позиции входных данных).
При добавлении поля этого типа в отображение
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
my_field: {
type: 'search_as_you_type'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
my_field: {
type: "search_as_you_type",
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
}
} Это создает следующие поля
| | Анализируется в соответствии с настройками отображения. Если анализатор не настроен, используется анализатор по умолчанию для индекса |
| | Оборачивает анализатор |
| | Оборачивает анализатор |
| | Оборачивает анализатор |
Размер шинглов в подполях можно настроить с помощью параметра отображения max_shingle_size. Значение по умолчанию — 3, а допустимые значения для этого параметра — целые числа от 2 до 4 включительно. Подполя шинглов будут созданы для каждого размера шингла от 2 до и включая max_shingle_size. Подполе my_field._index_prefix всегда использует анализатор из подполя шингла с max_shingle_size при построении собственного анализатора.
Увеличение max_shingle_size улучшит соответствие запросам с большим количеством последовательных терминов, но за счет увеличения размера индекса. Значение max_shingle_size по умолчанию, как правило, достаточно.
Один и тот же входной текст индексируется в каждое из этих полей автоматически с различными цепочками анализа, когда индексируемый документ имеет значение для корневого поля my_field.
resp = client.index(
index="my-index-000001",
id="1",
refresh=True,
document={
"my_field": "quick brown fox jump lazy dog"
},
)
print(resp) response = client.index(
index: 'my-index-000001',
id: 1,
refresh: true,
body: {
my_field: 'quick brown fox jump lazy dog'
}
)
puts response const response = await client.index({
index: "my-index-000001",
id: 1,
refresh: "true",
document: {
my_field: "quick brown fox jump lazy dog",
},
});
console.log(response); PUT my-index-000001/_doc/1?refresh
{
"my_field": "quick brown fox jump lazy dog"
} Наиболее эффективный способ запроса для использования сценария поиска по мере ввода — это, как правило, запрос multi_match типа bool_prefix, который нацелен на корневое search_as_you_type поле и его подполя шинглов. Это может сопоставлять термины запроса в любом порядке, но будет давать более высокую оценку документам, если они содержат термины в порядке в подполе шинглов.
response = client.search(
index: 'my-index-000001',
body: {
query: {
multi_match: {
query: 'brown f',
type: 'bool_prefix',
fields: [
'my_field',
'my_field._2gram',
'my_field._3gram'
]
}
}
}
)
puts response 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",
"_id" : "1",
"_score" : 0.8630463,
"_source" : {
"my_field" : "quick brown fox jump lazy dog"
}
}
]
}
} Для поиска документов, которые строго соответствуют терминам запроса в порядке, или для поиска с использованием других свойств запросов фраз, используйте запрос match_phrase_prefix для корневого поля. Также можно использовать запрос match_phrase, если последний термин должен быть сопоставлен точно, а не как префикс. Использование запросов фраз может быть менее эффективным, чем использование запроса match_bool_prefix.
resp = client.search(
index="my-index-000001",
query={
"match_phrase_prefix": {
"my_field": "brown f"
}
},
)
print(resp) response = client.search(
index: 'my-index-000001',
body: {
query: {
match_phrase_prefix: {
my_field: 'brown f'
}
}
}
)
puts response const response = await client.search({
index: "my-index-000001",
query: {
match_phrase_prefix: {
my_field: "brown f",
},
},
});
console.log(response); 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. Этот параметр настраивает корневое поле и подполя шинглов, где его значение по умолчанию —true. Он не настраивает подполе префикса, где его значение —false. -
store - Должно ли значение поля храниться и быть доступным отдельно от поля
_source? Принимает значенияtrueилиfalse(по умолчанию). Этот параметр настраивает только корневое поле и не настраивает подполя. -
search_analyzer - Анализатор
analyzer, который должен использоваться во время поиска по полям типаtext. По умолчанию используется значениеanalyzer. -
search_quote_analyzer - Анализатор
analyzer, который должен использоваться во время поиска, когда встречается фраза. По умолчанию используется значениеsearch_analyzer. -
similarity - Какой алгоритм подсчета оценки или сходства следует использовать. По умолчанию —
BM25. -
term_vector - Следует ли хранить векторы терминов для поля? По умолчанию —
no. Этот параметр настраивает корневое поле и подполя шинглов, но не подполе префикса.
Оптимизация запросов с префиксом
При выполнении запроса с префиксом к корневому полю или любому его подполю, запрос будет переписан в запрос с термином на подполе ._index_prefix. Это обеспечивает более эффективное соответствие, чем обычно для запросов с prefix по текстовым полям, так как префиксы с определенной длиной каждого фрагмента индексируются напрямую как термины в подполе ._index_prefix.
Анализатор подполя ._index_prefix немного изменяет поведение создания фрагментов, чтобы также индексировать префиксы терминов в конце значения поля, которые обычно не генерируются как фрагменты. Например, если значение quick brown fox индексируется в поле search_as_you_type с max_shingle_size, равным 3, префиксы для brown fox и fox также индексируются в подполе ._index_prefix, даже если они не появляются как термины в подполе ._3gram. Это позволяет выполнить поиск всех терминов в входном значении поля.
Синтетическое _source
Синтетическое _source доступно только для индексов TSDB (индексы, у которых index.mode установлено в time_series). Для других индексов синтетическое _source находится в техническом предварительном просмотре. Функции в техническом предварительном просмотре могут быть изменены или удалены в будущих выпусках. Elastic будет работать над исправлением любых проблем, но функции в техническом предварительном просмотре не подпадают под SLA поддержки официальных функций GA.
Поля search_as_you_type поддерживают синтетическое _source по умолчанию.
© 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/search-as-you-type.html