搜索推荐,即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分词法的缺点是:为了照顾所有可能,于是把很多不必要的词也加入到索引中,索引项增加。

ElasticSearch的搜索推荐(typeahead)相关推荐

  1. 基于Elasticsearch实现搜索推荐

    在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此基于上进一步优化搜索体验,在当搜索无结果或结果过少时提供推荐搜索词给用户. ...

  2. ElasticSearch学习29_基于Elasticsearch实现搜索推荐

    2019独角兽企业重金招聘Python工程师标准>>> 在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此 ...

  3. 白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐

    文章目录 概述 官网 什么是ngram 什么是edge ngram ngram和index-time搜索推荐原理 例子 概述 继续跟中华石杉老师学习ES,第23篇 课程地址: https://www. ...

  4. 白话Elasticsearch22- 深度探秘搜索技术之match_phrase_prefix实现search-time搜索推荐

    文章目录 概述 match_phrase_prefix 官方说明 例子 总结 概述 继续跟中华石杉老师学习ES,第22篇 课程地址: https://www.roncoo.com/view/55 ma ...

  5. nsoutlineview 搜索_阿里巴巴搜索推荐广告三位一体的在线服务体系

    最近在工作中大量使用到了淘系的在线分发服务体系,可以快速高效的实现个性化内容分发,其技术架构的概览在这里分享给大家. AI·OS(Artificial Intelligence Online Serv ...

  6. 干货 | Elasticsearch 可搜索快照深入详解

    0.可搜索快照认知前提 Elasticsearch 可搜索快照是 7.10 版本才有的新功能,之前呼声非常高. Elastic 官方网站用一整页面介绍,可见对该功能的重视. https://www.e ...

  7. 降本提效,贝壳搜索推荐架构统一之路

    导语 | 搜索和推荐是用户获取信息的两种主要方式,在贝壳也是帮助客户找到房子的主要手段,那么二者都有哪些相似和不同之处?是否可以使用同一套架构来实现?统一架构之后又能带来哪些收益呢?本文是对贝壳搜索推 ...

  8. Elasticsearch 异步搜索 Async search 实战

    1.Elasticsearch 异步搜索定义 异步搜索 API 可异步执行搜索请求.监控其进度并检索可用的部分结果. 如下的官方介绍动画,能更加生动的介绍清楚异步检索. 传统检索 VS 异步检索,在数 ...

  9. ES之Highlight及Suggest搜索推荐详解

    一. Highlight高亮查询 a) 三种高亮: i. unified highlighter:默认的高亮方式,使用Lucene的实现方式 ii. plain highlighter:性能较高,消耗 ...

最新文章

  1. Pymol | Pymol绘制GridBox图
  2. 《基于Node.js实现简易聊天室系列之项目前期工作》
  3. mysql+sql+子查询语句_SQL子查询
  4. Unity Camera的两种模式
  5. 阅读理解常规解题思路
  6. 计算机视觉实战(九)信用卡数字识别项目(附完整代码)
  7. 如何使用CDSN写博客
  8. 计算机网络投标书质量保证措施,计算机网络标书模板.doc
  9. 基于Unity的A星算法实现
  10. openpyxl使用教程
  11. 数字证书和证书颁发机构的基础知识
  12. 【教学类-20-02】20221203《世界杯16强国旗-定量版》(大班)
  13. 老鱼Python数据分析——篇十五:“选股宝”使用API下载JSON格式数据
  14. 如何选择最好的研究方法?——Nvivo教程
  15. Web开发之常用框架BootStrap
  16. undefined reference to symbol ‘dlsym@@GLIBC_2.4‘ 解决
  17. 计算机在铁路中的应用论文800字,交通运输和交通论文,关于计算机信息网络系统在铁路交通运输管理中的应用相关参考文献资料-免费论文范文...
  18. 【亲测有效】如何解决Hadoop运行jar包 报错Exception in thread “main“ java.lang.ClassNotFoundException: /input
  19. McAfee白名单设置
  20. oracle max相同,关于oracle:具有相同名称的材料化视图和表

热门文章

  1. RIDE在linux系统下运行,在linux上执行robotframework用例
  2. Spring高级之注解@ComponentScan详解(超详细)
  3. 康乐主机系统怎么安装php,Kangle EP面板详细安装说明
  4. mysql 计划任务消耗_浅谈MySQL event 计划任务
  5. matlab怎么载入视频,怎样将视频导入matlab啊
  6. Java 算法 找素数
  7. 中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-接收和发送数据)
  8. Pytorch解决LSTM前向传播时报错:RuntimeError: input must have 3 dimensions, got 2
  9. Java中introduce方法_Java基础—继承
  10. android studio创建一个类继承application_带你全方位了解Android中的Context