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查询高效许多

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容