elasticsearch 7.0 新特性之 search as you type

相信大家都知道 搜索引擎除了能够返回你想要的内容外,还有另外一个重要的功能,就是搜索框的字段补全,当用户在输入框输入一段文本的前几个词时,下面会出现很多相关的候选词提示,那么在es7.0中这个场景很容易就通过 search_as_you_type 来实现

1、介绍

search_as_you_type filed是elasticsearch 7.0 新增的数据类型,它为用户提供了一种开箱即用的搜索即可见的解决方案,内部会自动拆分为多个子字段索引以支持高效查询,目前 search_as_you_type 实现前缀,中缀查询。

2、操作

  • mapping
PUT my_index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "search_as_you_type"
      }
    }
  }
}

上述操作会自动创建如下几个field:

字段 分词器
my_field 使用mapping时指定的分词器,没指定将使用默认分词器
my_field._2gram 使用2元gram进行分词
my_field._3gram 使用3元gram进行分词
my_field._index_prefix 使用edge gram进行分词操作,相当于1元gram(类似sql中的 like ‘abc%’)

N-gram中的N可以通过mapping中增加 max_shingle_size 参数进行控制,存放整型数据,默认值是3,可接受范围是[2,4],其中._index_prefix 会一直存在。

增大 max_shingle_size 会带来更多的索引存储,检索性能也会受到影响,一般情况下默认值就够用了。

索引到root field的文本也会被索引到其它的子字段里:

PUT my_index/_doc/1?refresh
{
  "my_field": "quick brown fox jump lazy dog"
}

实现 search_as_you_type 最高效的查询时使用类型为bool_prefix的multi_match query,下面是一个例子:

GET my_index/_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",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "my_field" : "quick brown fox jump lazy dog"
        }
      }
    ]
  }
}

虽然 match_phrase_prefix 也可以实现上述需求,但考虑到性能问题建议不要这么做。

  • 参数
    如果没做特别说明,search_as_you_type 类型的mapping参数与普通 text 类型的mapping参数是一致的:
参数 说明
analyzer 指定索引期间和搜索期间的分词器(索引期间的分词器能使用 search_analyzer参数覆盖),默认的分词器是 standard
index 是否进行索引 true 或 false ,设置为false将不能被检索
index_options 文本索引的粒度,支持 docs、freqs、positions、offsets
norms true 或 false;存储该字段归一化因子,如果字段不需要参与评分,可设置为false
store 是否独立存储field数据
search_analyzer 查询时分词器
search_quote_analyzer 默认使用 search_analyzer
similarity 指定相似度算法,默认是BM25
term_vector 是否存储term向量,默认是no

所有在my_field 上的前缀查询都会被重写成在 _index_prefix 字段上的查询,因为_index_prefix 会对每个term的前缀会直接索引,所以比传统的在text字段上进行prefix查询高效许多

你可能感兴趣的:(elasticsearch 7.0 新特性之 search as you type)