加载中

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_prefixmulti_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"]
      }
    }
  }
}
		
  1. 将 "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._2grammy_field._3gram

更多的子字段可以实现更精确的查询,但会增加索引大小。

由于 search_as_you_type 字段本质上是一个类似文本的字段,其映射接受以下参数,并且它们的行为类似于配置 text 数据类型字段时的行为。除非另有说明,这些选项以相同的方式配置根字段的子字段。

analyzer
应运用于 text 字段的 分析器,包括索引时和搜索时(除非被 search_analyzer 覆盖)。默认为默认索引分析器,或 standard 分析器
index
该字段是否应可搜索?接受 true(默认)或 false
index_options
为了搜索和高亮显示的目的,应在索引中存储哪些信息。默认为 positions
norms
在对查询进行评分时是否应考虑字段长度。接受 truefalse。此选项配置根字段和分片子字段,其默认值为 true。它不配置前缀子字段(前缀子字段中该值为 false)。
store
是否应存储字段值并能够与 _source 字段分开检索。接受 truefalse(默认)。此选项仅配置根字段,不配置任何子字段。
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 foxfox 的前缀也会被索引到 ._index_prefix 子字段中,尽管它们并未作为词条出现在 ._3gram 子字段中。这允许对字段输入中的所有词条进行补全。

search_as_you_type 字段在其默认配置中支持合成 _source(synthetic _source

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.