加载中

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_prefixmulti_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"]
      }
    }
  }
}
  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
(可选,整数)要创建的最大 shingle 大小。有效值为 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。此选项配置根字段和 shingle 子字段,其默认值为 true。它不配置前缀子字段,该子字段的默认值为 false
store
字段值是否应独立于 _source 字段存储和检索。接受 truefalse(默认)。此选项仅配置根字段,不配置任何子字段。
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 foxfox 的前缀没有出现在 ._3gram 子字段中,它们也会被索引到 ._index_prefix 子字段中。这允许对字段输入的全部术语进行自动完成。

重要提示

合成 _source 仅对 TSDB 索引(index.mode 设置为 time_series 的索引)正式发布。对于其他索引,合成 _source 处于技术预览阶段。技术预览中的功能可能在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受正式发布的 GA 功能的支持 SLA 约束。

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

© . All rights reserved.