ElasticSearch的搜索推荐(typeahead)

搜索推荐,即typeahead,也就是我们在搜索的时候,比如输入lucene el,这时候会给我一些提示:

lucene elasticsearch

lucene elasticsearch 区别

lucene elasticsearch solr

 

一 短语前缀匹配(phrase prefix matching)

即我通过使用短语前缀匹配,既可以查询所有lucene el开始的短语的文档。原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索。

 

lucene会进行match搜索对应的文档;el作为前缀去扫描整个倒排索引找到以el开头的文档;然后再在所有文档中找到既包含lucene,又包含el的文档,根据你的slop参数,看在slop范围内,能不能让lucene el正好跟doc中的lucene 和 el开始的单词的position匹配

 

POST /typeahead/guitar/_search

{

   "query":{

       "match_phrase_prefix": {

          "title": {

              "query":"Guitar F",

              "slop":2

           }

        }

    }

}

 

但是这种机制,性能不好,因为最后一个前缀始终要去扫描大量的索引,性能可能会很差

 

二 ngram

2.1 什么是ngram,其运行原理是什么?

ngram是一种分词方法照顾所有的可能,N表示一个数字,比如2-gram分词法,表示以长度为2进行分割单词,然后编进索引。比如针对hadoop这个term。

如果

N=1:h a d o o p

N=2: ha ad do oo op

N=3: had ado doo oop

N=4: hado adoo doop

N=5: hadoo adoop

N=6: hadoop

 

2.2 什么是edge_ngram

edge_ngram: 指的就是一个词条过滤器,然后会根据在索引里配置的最小ngram和最大ngram进行词条的切分。

PUT /typeahead

{

   "settings": {

       "analysis": {

           "filter": {

               "autocomplete_filter": {

                   "type":    "edge_ngram",

                   "min_gram": 1,

                   "max_gram": 15

               }

           },

           "analyzer": {

               "autocomplete": {

                   "type":     "custom",

                   "tokenizer": "standard",

                   "filter": [

                        "lowercase",

                        "autocomplete_filter"

                   ]

               }

            }

        }

    }

}

min_ngram: 1表示至少为1

max_ngram: 表示词条最大长度为15,超过这个长度将不再进行切分

我们可以利用如下代码检测:

GET /typeahead/_analyze

{

 "analyzer": "autocomplete",

 "text": " congratulations "

}

 

2.3 利用ngram进行搜索推荐

首先索引进行映射

PUT /typeahead/_mapping/guitar

{

 "properties": {

     "title": {

         "type":    "string",

         "analyzer": "autocomplete",

         "search_analyzer": "standard"

      }

  }

}

 

然后就可以开始搜索了:

POST /typeahead/guitar/_search

{

   "query": {

       "match_phrase":{

           "title":{

               "query": "Guitar F",

               "slop":3

            }

        }

    }

}

 

2.4 ngram 优缺点

优点:比短语前缀匹配的性能更好些

缺点:ngram分词法的缺点是:为了照顾所有可能,于是把很多不必要的词也加入到索引中,索引项增加。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值