search-as-you-type 字段类型
search_as_you_type
字段类型是一种类似文本的字段,经过优化,可直接提供用于 as-you-type 自动完成用例的查询支持。它会创建一系列子字段,这些子字段经过分析以索引术语,这些术语可以由部分匹配整个索引文本值的查询高效匹配。支持前缀自动完成(即匹配输入开头处的术语)和中缀自动完成(即匹配输入中任何位置的术语)。
将此类型的字段添加到映射时
PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
}
}
这将创建以下字段
my_field
- 按照映射中的配置进行分析。如果未配置分析器,则使用索引的默认分析器
my_field._2gram
- 使用 shingle 大小为 2 的 shingle 分词过滤器包装
my_field
的分析器 my_field._3gram
- 使用 shingle 大小为 3 的 shingle 分词过滤器包装
my_field
的分析器 my_field._index_prefix
- 使用 edge ngram 分词过滤器包装
my_field._3gram
的分析器
子字段中 shingle 的大小可以使用 max_shingle_size
映射参数进行配置。默认值为 3,此参数的有效值为 2 - 4(含)之间的整数值。将为从 2 到 max_shingle_size
(含)之间的每个 shingle 大小创建 shingle 子字段。my_field._index_prefix
子字段在构建自己的分析器时,将始终使用具有 max_shingle_size
的 shingle 子字段的分析器。
增加 max_shingle_size
将提高包含更多连续术语的查询的匹配度,但会增加索引大小。默认的 max_shingle_size
通常就足够了。
当索引文档的根字段 my_field
有值时,相同的输入文本会自动索引到这些字段中的每一个,并使用它们不同的分析链。
PUT my-index-000001/_doc/1?refresh
{
"my_field": "quick brown fox jump lazy dog"
}
用于 as-you-type 搜索用例的最有效查询方式通常是类型为 bool_prefix
的 multi_match
查询,该查询针对根 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"
]
}
},
"highlight": {
"fields": {
"my_field": {
"matched_fields": ["my_field._index_prefix"]
}
}
}
}
- 将 "my_field._index_prefix" 添加到
matched_fields
中,允许根据 "my_field._index_prefix" 字段的匹配项来突出显示 "my_field"。
{
"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"
},
"highlight": {
"my_field": [
"quick <em>brown fox jump lazy</em> 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
字段的映射中接受,并且特定于此字段类型
max_shingle_size
- (可选,整数)要创建的最大 shingle 大小。有效值为
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
。它不配置前缀子字段,该子字段的默认值为false
。 store
- 字段值是否应独立于
_source
字段存储和检索。接受true
或false
(默认)。此选项仅配置根字段,不配置任何子字段。 search_analyzer
- 在搜索时应用于
text
字段的 分析器。默认为analyzer
设置。 search_quote_analyzer
- 遇到短语时,在搜索时应使用的 分析器。默认为
search_analyzer
设置。 similarity
- 应使用哪种评分算法或相似度。默认为
BM25
。 term_vector
- 是否应为该字段存储词向量。默认为
no
。此选项配置根字段和 shingle 子字段,但不配置前缀子字段。
当对根字段或其任何子字段进行 prefix
查询时,查询将被重写为对 ._index_prefix
子字段的 term
查询。这比对文本字段进行常规的 prefix
查询匹配效率更高,因为每个 shingle 的一定长度的前缀直接作为术语索引在 ._index_prefix
子字段中。
._index_prefix
子字段的分析器稍微修改了 shingle 构建行为,以便也索引字段值末尾通常不会作为 shingle 生成的术语的前缀。例如,如果值 quick brown fox
索引到 max_shingle_size
为 3 的 search_as_you_type
字段中,则即使 brown fox
和 fox
的前缀没有出现在 ._3gram
子字段中,它们也会被索引到 ._index_prefix
子字段中。这允许对字段输入的全部术语进行自动完成。
合成 _source
仅对 TSDB 索引(index.mode
设置为 time_series
的索引)正式发布。对于其他索引,合成 _source
处于技术预览阶段。技术预览中的功能可能在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受正式发布的 GA 功能的支持 SLA 约束。
search_as_you_type
字段在其默认配置中支持 合成 _source
。