1、什么是相似推荐?

拿我们身边的算法“投喂”为主的头条、抖音、微信视频号等举例,如果你喜欢乒乓球,每天推送给你的都是乒乓球比赛视频集锦;如果你喜欢成功人士演讲,每天都是马云、马化腾、刘强东等商业巨鳄的演讲。

再拿电商的示例如下:比如我近期购买的吴军老师推荐的科普经典巨著《从一到无穷大》,京东会给我推荐樊登读书带火的书《微积分原理》。

其实,在实际业务实战环节,或多或少也会有类似的功能,Elasticsearch 有没有类似功能呢?

大家实战环节遇到的问题也大致如下:

Q1:ES 有相似搜索这个功能吧?我记得有个 suggester吧?

Q2:ES有没有处理相似文字的案例?把相似文章聚合起来。

来自《死磕Elasticsearch 知识星球》微信群

2、Elasticsearch 相似推荐功能实现

这里不得不介绍:MLT 检索。对!你没看错。不是:MIT(麻省理工学院),是 Elasticsearch 一种检索类型 MLT(More Like This Query )。

看下图,建立个全局认识。MLT 属于:Query DSL下的专业检索(Specialized queries)的范畴。

3、More Like This 检索介绍

More Like This 检索定义:查找与给定文档“相似”的文档。

4、More Like This 底层逻辑

MLT 查询简单地从输入的待查询文本中提取文本,对其进行分析,通常在字段中使用相同的分析器,然后选择具有最高 tf-idf 的前 K 个词组以形成这些词组的组合查询语句。

假设我们想找到与给定输入文档相似的所有文档。显然,输入文档本身应该是该类型查询的最佳匹配。为什么呢?基于 Lucene tf-idf 评分公式计算得出的呀。

如下就是 Lucene tf-idf 评分模型。

如果对此评分不了解的同学,推荐阅读:

干货 | 一步步拆解 Elasticsearch BM25 模型评分细节

实战 | Elasticsearch自定义评分的N种方法

MLT 查询的本质是:从待检索语句中提取文本,然后用分词器切分,选择 tf-idf 分值高的前 K 个术语形成检索语句。基于检索语句返回的结果就是相似度查询结果。

为避免歧义,对照的英文如下:

The MLT query simply extracts the text from the input document, analyzes it, usually using the same analyzer at the field, then selects the top K terms with highest tf-idf to form a disjunctive query of these terms.

如果原理还不够清晰,我将核心 Lucene 源码的逻辑简要说明如下:

  • 步骤 1:根据输入的待查询的文档,抽取词组单元(term),结合TF*IDF 评分形成优先级队列。

抽取词时会过滤掉停用词、不满足最小词频的词等不满足限定条件的词。

  • 步骤 2:结合步骤 1 的优先级队列,生成布尔查询语句。

Lucene 源码部分截图

循环超过最大查询词数目,则停止构建查询语句。

最大查询数据值 max_query_terms 默认是:25。增加此值会以牺牲查询执行速度为代价提供更高的准确性。

  • 步骤 3:基于步骤2构造的布尔查询语句,获取查询结果。

返回结果就是类似推荐功能的相似文章。

看的出来,这比我们常见的精准匹配 term query 和全文检索 match query、match_pharse query 都要复杂很多。

5、More Like This 前置条件

执行 MLT 的字段必须被索引并且类型为 text 或 keyword。此外,当对文档使用相似度检索时,必须启用 _source 或设置为 stored 或存储为 term_vector。为了加快分析速度,可以在索引时存储 terrm vectors。

读者看到这里可能会疑惑:啥叫 term vectors ?

有必要解释一下:

term vectors 组成:

  • terms 分词单元列表。

  • 每个分词单元的位置 position  和序号。

  • 分词后的单词或字在原有串中的起始位置 start_offset 、结束位置  end_offset 和偏移值。

  • 有效载荷。与位置相关的用户定义的二进制值。

给了一堆术语,还是看不懂,再来?!

给个例子,一看就明白了。

PUT my-index-0000012
{"mappings": {"properties": {"text": {"type": "text","term_vector": "with_positions_offsets"}}}
}PUT my-index-0000012/_doc/1
{"text": "Quick brown fox fox"
}
GET /my-index-0000012/_termvectors/1

position 更精确的说法是:序号。

  • Quick 的 position 为 0;

  • brown 的 position 为 1;

  • quick 的 start_offset 为 0;

  • quick 的 end_offset 为 5。

6、More Like This 实战一把

光说不练是假把式,实战一把,一探究竟。

插入一批数据,数据来源:百度热点新闻 。

DELETE news
PUT news
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_smart"}}}
}POST news/_bulk
{ "index":  { "_id":1 }}
{"title":"演唱会突发意外!知名男星受伤,本人最新回应"}
{ "index":  { "_id":2 }}
{"title":"张杰演唱会主办方道歉:舞台升降设备出现故障"}
{ "index":  { "_id":3 }}
{"title":"谢娜发文回应张杰受伤"}
{ "index":  { "_id":4 }}
{"title":"张杰回应受伤:不会有大碍,请歌迷和家人朋友们放宽心"}
{ "index":  { "_id":5 }}
{"title":"张杰表演时从电梯坠落 手指血流不止"}
{ "index":  { "_id":6 }}
{"title":"谢娜回应张杰受伤:他问的第一句话就是怕吓到女儿"}
{ "index":  { "_id":7 }}
{"title":"张杰演唱会出意外后,发长文给粉丝报平安,谢娜透露张杰本人..."}
{ "index":  { "_id":8}}
{"title":"张杰明星资料大全爱奇艺泡泡"}

PS:以上仅是百度公开的热点新闻,以此举例相似查询,别无其他用途,特此说明。

执行 MLT:

POST news/_search
{"query": {"more_like_this": {"fields": ["title"],"like": ["张杰开演唱会从升降机上掉落"],"analyzer": "ik_smart","min_doc_freq": 2,"min_term_freq": 1}}
}

返回结果如下:

以如上截图最后一条数据为例,强调说明一下:注意到一个细节,返回结果只是相似,并没有真正做到语义相关。

7、More Like This 核心语法详解

参数看着很好解释,但着实非常难理解,特此解读如下:

  • "min_doc_freq": 2

最小的文档频率,默认为 5。

什么意思呢?

就拿上面的示例来说,至少得有两篇文章才可以,不管这两篇文章与输入相关与否。

更具体点说,如果bulk 写入仅一篇document,哪怕和标题一致也无法返回结果。

  • "min_term_freq": 1

文档中词组的最低频率,默认是2,低于此频率的会被忽略。

什么意思呢?

就是待检索语句的其中一个分词单元的词频的最小值。

PUT news
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_smart"}}}
}
POST news/_bulk
{ "index":  { "_id":1 }}
{"title":"张杰演唱会突发意外!知名男星受伤,本人最新回应"}
{ "index":  { "_id":2 }}
{"title":"hello kitty"}POST news/_search
{"query": {"more_like_this": {"fields": ["title"],"like": ["张杰回应张杰受伤"],"analyzer": "ik_smart","min_doc_freq": 1,"min_term_freq": 2}}
}

上面的例子更有说服力。

更为具体的说,like部分待检索语句的分词词频要至少有一个 >=2 。

更多参数建议参考官方文档,不再赘述。

8、Elasticsearch 相似推荐其他的实现方案

在第 6 部分提及,more like this 并没有实现完全的相关度推荐,出现了“噪音” 数据。

所以,实战环节使用 more like this 多半基于燃眉之急。

如果想深入的实现相似度推荐,推荐方案:

基于类似 simhash 的方式,给每个文档打上 hash 值,基于海明距离实现相似度推荐。

如果想再深入就需要借助:

基于协同过滤的推荐算法、基于关联规则的推荐算法、基于知识的推理算法或者组合推理算法实现。

9、小结

本文介绍了 Elasticsearch 中实现相似推荐的 More Like This 检索方法、实现原理、案例解读。

目的是给大家业务系统实现相似推荐提供了理论和实践支撑。

大家实战环节如何实现的相似推荐呢?欢迎留言讨论细节。

参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html

https://spoon-elastic.com/all-elastic-search-post/more-like-this-query-mlt-suggest-similar-content-with-elasticsearch/

https://qbox.io/blog/mlt-similar-documents-in-elasticsearch-more-like-this-query/

https://spoon-elastic.com/all-elastic-search-post/more-like-this-query-mlt-suggest-similar-content-with-elasticsearch/

https://newbedev.com/elasticsearch-more-like-this-query

https://www.linkedin.com/pulse/finding-similar-documents-elasticsearch-morelikethis-fl%C3%A1vio-knob?articleId=6657988773374111744

《Lucene 原理与代码分析》

推荐

1、重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)

2、Elasticsearch 7.X 进阶实战私训课(口碑不错)

更短时间更快习得更多干货!

已带领70位球友通过 Elastic 官方认证!

中国仅通过百余人

比同事抢先一步学习进阶干货!

Elasticsearch 如何实现相似推荐功能?相关推荐

  1. Elasticsearch:Elasticsearch基础上构建推荐引擎 资料收集

    1. 深入了解推荐引擎组件(基于Apache Mahout和Elasticsearch) http://www.csdn.net/article/2015-05-14/2824676 ES+mahou ...

  2. AI一分钟 | 网信办暂停快手、火山小视频算法推荐功能;无需人类司机,加州将允许自动驾驶汽车接送乘客

     整理 | 费棋 一分钟AI 据加州公共事业监管机构表示,它们将允许自动驾驶汽车接送乘客,且无需配备人类司机. 有知情人士透露,亚马逊公司正在考虑是否通过 Alexa 语音助手提供个人对个人的支付 ...

  3. php简单实例,php实现推荐功能的简单实例

    php实现推荐功能的简单实例,魔法,标题,文章,简明扼要,数组 php实现推荐功能的简单实例 易采站长站,站长之家为您整理了php实现推荐功能的简单实例的相关内容. 利用similar_text将这些 ...

  4. 微信公众号页面模版怎么添加文章推荐功能

    微信公众号中发布的文章可以添加推荐的文章,该怎么添加文章推荐功能呢?下面我们就来看看详细的教程. 微信公众号页面模版怎么添加文章推荐功能? 1.登录微信公众平台,选择"功能"--& ...

  5. Springboot具有智能推荐功能的外卖点餐系统bia14计算机毕业设计-课程设计-期末作业-毕设程序代做

    Springboot具有智能推荐功能的外卖点餐系统bia14计算机毕业设计-课程设计-期末作业-毕设程序代做 [免费赠送源码]Springboot具有智能推荐功能的外卖点餐系统bia14计算机毕业设计 ...

  6. Spotify 每周推荐功能:基于机器学习的音乐推荐

    原文地址:Spotify's Discover Weekly: How machine learning finds your new music 原文作者:Sophia Ciocca 译文出自:掘金 ...

  7. 【软件工程大作业】对于一款具有个性化推荐功能的购物网站的可行性分析

    文章目录 要求 一.引言 1.编写目的 2.项目背景 3.参考资料 二.可行性分析 1.技术可行性分析 1.1对网站的简要概述 1.2对网站的简要概述 1.3 网站运行技术基础 1.3.1技术基础 1 ...

  8. 探花交友_第10章_实现推荐功能

    探花交友_第10章_实现推荐功能 文章目录 探花交友_第10章_实现推荐功能 1.了解推荐系统 1.1.什么是推荐系统? 1.2.电商是推荐系统的先行者 1.3.推荐系统业务流程 1.4.协同过滤推荐 ...

  9. Springboot毕设项目具有智能推荐功能的外卖点餐系统bia14(java+VUE+Mybatis+Maven+Mysql)

    Springboot毕设项目具有智能推荐功能的外卖点餐系统bia14(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mys ...

  10. 【王喆-推荐系统】复习篇-Sparrow的个性化推荐功能

    学习总结 首先,利用 Spark 对 MovieLens 原始数据进行了处理,生成了训练样本和特征,样本供 TensorFlow 进行模型训练,特征存入 Redis 供线上推断使用. 在 Tensor ...

最新文章

  1. data.DataLoader 数据丢失 不能复用
  2. 操作系统c语言两个进程制约且互斥,电大计算机本科《操作系统》作业2及答案...
  3. Python类简明教程
  4. 怎么查linux的虚拟内核,Linux 内核 虚拟地址 物理地址 转换
  5. nodejs 面向对象 私有变量_Java准备校招之面向对象总结
  6. java序列化深克隆_如何在内存序列化中使用Java深克隆对象
  7. python处理mat数据_python读取.mat文件的数据及实例代码
  8. php如何查询本周的数据,php、mysql查询当天,查询本周,查询本月的数据实例
  9. cocos studio 基本功能添加——场景(Scene)
  10. java kafka面试题_八年面试生涯,整理了一套Kafka面试题
  11. TODS:从时间序列数据中检测不同类型的异常值
  12. 服务器系统做双备份,云服务器如何做双机热备份
  13. VirtualBox搭建OpenWrt软路由
  14. 海淘也疯狂 跨境电商网站8月监测报告
  15. 游戏“头号玩家”:像做游戏一样做web开发
  16. vscode没有应用程序与此操作的指定文件有关联
  17. Typora远程解绑设备的方法
  18. 乱舞之双刀--mhp2怪物猎人双刀攻略…
  19. 1646 获取生成数组中的最大值
  20. 返回const指针与返回const引用区别

热门文章

  1. 手机版wps怎么制作折线图_手机简历制作 | 微信怎么在线制作简历
  2. 万字长文带你快速了解并上手Testcontainers
  3. HADOOP的搭建和配置(一)基础环境配置
  4. 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
  5. matlab逐步线性回归分析法,[转载]matlab 回归分析
  6. 策略模式——鸭子游戏
  7. 计算机概论二进制加法,计算机科学概论二进制
  8. 通过图书编号查询python_基于Python的图书ISBN查询接口调用代码实例
  9. 听说你要删库跑路了?这篇Linux脚本请收好
  10. word插入脚注后最后一页多了一个分页符(下一页),导致最后多了一个空白页,删除不掉。