Search-as-you-type 字段类型
search_as_you_type 字段类型是一种类似文本的字段,经过优化,可为“即输即搜”(as-you-type)补全用例提供开箱即用的查询支持。它会创建一系列子字段,这些子字段经过分析后可索引词条,从而能够被部分匹配整个已索引文本值的查询高效匹配。同时支持前缀补全(即匹配从输入开头开始的词条)和中缀补全(即匹配输入中任意位置的词条)。
在将此类型的字段添加到映射(mapping)时
PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
}
}
这会创建以下字段
my_field- 按照映射中的配置进行分析。如果未配置分析器(analyzer),则使用索引的默认分析器
my_field._2gram- 用长度为 2 的分片(shingle)词元过滤器(token filter)包装
my_field的分析器 my_field._3gram- 用长度为 3 的分片词元过滤器包装
my_field的分析器 my_field._index_prefix- 用边 n-gram(edge ngram)词元过滤器包装
my_field._3gram的分析器
子字段中分片的尺寸可以通过 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 赋有值时,相同的输入文本会凭借其各自不同的分析链,自动被索引到这些字段中。
PUT my-index-000001/_doc/1?refresh
{
"my_field": "quick brown fox jump lazy dog"
}
为“即输即搜”用例提供查询服务最高效的方法通常是针对根 search_as_you_type 字段及其分片子字段进行类型为 bool_prefix 的 multi_match 查询。这可以按任意顺序匹配查询词条,但如果文档在分片子字段中按顺序包含这些词条,则会赋予更高的评分。
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- (可选,整数)要创建的最大分片大小。有效值为从
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- 在搜索时应用于
text字段的analyzer。默认为analyzer设置。 search_quote_analyzer- 遇到短语时在搜索时应使用的
analyzer。默认为search_analyzer设置。 similarity- 应使用哪个评分算法或相似度。默认为
BM25。 term_vector- 是否应为该字段存储词条向量(term vectors)。默认为
no。此选项配置根字段和分片子字段,但不配置前缀子字段。
当对根字段或其任何子字段进行 prefix 查询时,查询将被重写为对 ._index_prefix 子字段的 term 查询。这比文本字段上的典型 prefix 查询匹配效率更高,因为每个分片达到一定长度前的前缀会直接作为词条索引到 ._index_prefix 子字段中。
._index_prefix 子字段的分析器稍微修改了分片构建行为,以便同时索引字段值末尾处的词条前缀,而这些前缀通常不会被生成为分片。例如,如果将值 quick brown fox 索引到 max_shingle_size 为 3 的 search_as_you_type 字段中,则 brown fox 和 fox 的前缀也会被索引到 ._index_prefix 子字段中,尽管它们并未作为词条出现在 ._3gram 子字段中。这允许对字段输入中的所有词条进行补全。
search_as_you_type 字段在其默认配置中支持合成 _source(synthetic _source)。