ElasticSearch - 输入即搜索 edge n-gram

本文介绍了如何使用ElasticSearch的边缘n-gram优化输入即搜索的性能。通过建立索引时使用边缘n-gram,可以提高查询速度,减少延迟。文章还提供了实例,展示了如何配置分析器和使用keyword分词器,以确保精确值字段也能利用边缘n-gram进行搜索优化。
  • 在此之前,ES所有的查询都是针对整个词进行操作,也就是说倒排索引存了hello这个词,一定得输入hello才能找到这个词,输入 h 或是 he 都找不到倒排索引中的hello

    • 然而在现实情况下,用户已经渐渐习惯在输入完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search),或是可以称为 输入即搜索(search-as-you-type)

    • 虽然ES提供了一系列的前缀搜索match_phrase、prefix、wildcard、regexp,然而这样的查询的性能非常差,要知道用户每多输入一个新的字母,就意味著要重新进行一次搜索,在实时的web系统中,100毫秒可能就会是一个难以忍受的延迟

    • 因此为了加快 输入即搜索 的查询效率,可以改使用edge n-gram建立索引,如此可以避免使用前缀查询,在建立索引时就进行优化,使用空间换取时间,让查询的速率增快

  • 使用edge n-gram建立索引

    • 假设有一个词hello,普通建索引时,就是把这个词hello放入倒排索引

      • 用户输入h、he时会找不到索引(倒排索引中只有hello),因此匹配失败

    • 而对于输入即搜索这种应用场景,可以使用一种特殊的n-gram,称爲 边界n-grams (edge n-grams)

      • 所谓的edge n-gram,就是指它会固定词语开始的一边滑动窗口,他的结果取决于 n 的选择长度

      • 以单词hello爲例,它的edge n-gram的结果如下

        h
        he
        hel
        hell
        hello
      • 因此可以发现到,在使用edge n-gram建索引时,一个单词会生成好几个索引,而这些索引一定是重头开始

      • 这符合了输入即搜索的特性,即是用户打h、he能找到倒排中的索引hhe,而这些索引对应著的数据就是hello

  • 具体实例

    • 建立索引时使用edge n-gram的token过滤器,为每个经过这个token过滤器的词条们,都生成从头开始的字符组合

      • 假设有一个输入QUICK! RUN!,分词器会先将它分词成两个词quickr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值