原标题:一个热词推荐的简单实现

为什么想做这个东西

一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章《 Redis 与搜索热词推荐 》,然而只写了思路。所以,就是想自己实现一个。

先上个效果图,再聊:

P.S. 按四年前,要写这样的前端效果,对于我这个后台开发,还是挺困难的。而现在,简单的学了下Vue.js,再加上同事的小小指点,就搞定了。��

热词推荐的本质

假如你预先就知道了用户输入:s、sz、shen、深这些字时,就是想搜“深圳”,那是不是说,我们只要提前将这些字放到一个Map结构中,将用户的输入想像出一个key,value就是“深圳”。

说到底,热词推荐的本质就是一个大大的Map。难点就在于如何更新这个Map,以至于让用户觉得“智能”,或觉得我们在给他们做“推荐”。

这个Map,常常被人称为“索引”。其实使用“索引” 这个名词也更准确一些。Map中的Key是不能重复的。但是我们数据结构是要求可重复的,为什么呢?因为,在系统中,s、sh、shen、深等等这些都是key,而它们对应的value,可能相同,又可能不同。举个例子:

仔细看到其中的不同了吗?同时,这里还有一个问题,那就是当用户输入s时,出现了10个value,我们如何给这些value如何排序呢?

为了与排序模型解耦,我们为每个value都给出一个分数score。score越大,越排前面。最终索引结构就变成了这样子:

P.S. 这些score之所以都为0,是因为数据问题。

总的来说,关于热词推荐,我们需要解决以下问题:

● 如何存储索引的数据?

● 如何构建索引?也就是一开始时,我们怎么知道用户输入“s” 就是要搜“深圳”呢?

● 如何根据用户的反馈行为来更新索引?当用户输入 “s” 出现了“1 沙河”和“2 深圳”,用户选择了“深圳”,那么当其他用户输入“s”时,我们是不是应该将“深圳”这个词放到前面呢?

基于 Solr 实现的弊端

美团在几年前也写了一篇文章来介绍自己的热词推荐:搜索引擎关键字智能提示的一种实现。然而这种实现,个人觉得有个设计非常不好。因为Solr在整个系统中,即做了“存储索引”的角色,又做了“构建索引”的角色。违反了职责单一原则。因为当我们想改变构建索引的算法时,同时会影响到“存储索引”的逻辑。

以下是他们的实现逻辑截图:

另一种基于 Redis 的实现

我目前只写了一个简单实现,而且还没有实现“根据用户反馈来更新索引”的功能。这个功能可实现得很简单,也可以实现得很复杂。本文不讨论。

同时,生产环境会更复杂一些。比如要实现高可用。我个人能力有限,还没有能实现。但是思路是有的:所有出现单点的地方都要做成分布式的,比如Redis就做成Redis Cluster。

以下是架构图:

图中,InitWorker负责将我准备好的全国地名大全的数据,构建成索引,然后写到Redis中。用户则可以通过基于Openresty写的APP去查询Redis中的数据。

使用本系统的方法:

P.S. 本系统使用Ansible做自动化部署,所以,请提前安装好Ansible。

1、git clone https://github.com/zacker330/hot-word-recommend.git

2、准备两个Ubuntu 16的机器,如果你懂Vagrant的话,直接使用我的Vagrantfile就好了

3、进入到项目中,执行ansible-playbook ./ansible/playbook.yml -i ./ansible/inventory -u vagrant -k 来自动化部署所有组件。如果使用Vagrant来搭建的环境,密码是 vagrant,以下同,将不在重述。

4、打包我们的InitWorker项目:mvn assembly:assembly

5、部署InitWorker: ansible-playbook ./ansible/deploy-worker.yml -i ./ansible/inventory -u vagrant -k

6、打开链接测试:http://192.168.10.11/index.lsp 。IP换成你自己部署的机器的IP。

具体代码,自己看了。为方便阅读,我觉得有必要注释一下项目结构:

小结

热词推荐的“智能”所在处就在于索引的构建算法。简单一点的做法就是每当用户点击某搜索结果时,我们就给这个索引条目加权1。感兴趣的同学可以实现来玩玩。

推荐阅读

点击“阅读原文”查看更多精彩内容返回搜狐,查看更多

责任编辑:

java 热词推荐搜索实现,一个热词推荐的简单实现相关推荐

  1. java 热词推荐搜索实现,Flink 热词统计(1): 基础功能实现

    本系列文章将从热词统计需求讲起,讲解flink在实际项目中的应用.部署.容错.项目中的代码为scala所编写,没有用 java 的原因是scala语言看起来更加简练,同时与java语言的兼容性较好,可 ...

  2. Java即时编译:不仅仅是一个流行词

    最近的Java生产性能问题迫使我重新审视并真正欣赏Java VM即时(JIT)编译器. 大多数Java开发人员和支持人员都听说过这种JVM运行时性能优化,但是有多少人真正理解并欣赏它的好处? 本文将与 ...

  3. java 热词推荐搜索实现,Redis 与搜索热词推荐

    本文解决一个非常普通的需求:在用户输入搜索关键词的过程中,系统给出搜索的推荐关键词. 实现的方式还是通过 redis,这次使用它 5 种数据结构中的 zset,也就是有序集合. Redis的有序集合( ...

  4. 搜索输入框下拉列表热词搜索的实现

    我们在百度时简单输入一些信息会在输入框的下面以列表的形式显示几条数据,这些都是与你所输入信息相关的热词,以提升用户的体验.下面我们做下简单的实现: 1. 热词: 这些词你可以从后台数据库中取,可以在c ...

  5. 搜索推荐系统根据用户搜索频率(热搜)排序

    之前写的三叉树,有点儿简单,并不能满足实际项目的需要.先简单分析一下solr中搜索推荐系统的核心算法. wiki中有关于solr的搜索推荐的详细描述,但是核心算法需要自己查看源代码.关于wiki上的解 ...

  6. springboot基于Elasticsearch6.x版本进行ES同义词、停用词(停止词)插件配置,远程词典热加载及数据库词典热加载总结,es停用词热更新,es同义词热更新

    前言:ES版本差异较大,建议跨版本的同学,可以先了解一下版本区别,建议不要跨版本使用插件或者进行项目调试. 本总结主要基于6.x版本的6.5.1(6.2.2实测可用),分词器为IK,下载地址:http ...

  7. one-hot(独热)、bag of word(词袋)、word-Embedding(词嵌入)浅析

    目录 词袋模型 one-hot word-embedding 我们知道,传统的数据挖掘任务面向的是结构化数据.结构化数据很好理解,就是很有结构的数据嘛. 比如下面这张银行客户数据库中的表格: 编号 姓 ...

  8. java 动态卸载jar包_jar包 热加载/卸载 的初步实现

    这两天做的项目中按照客户要求需要将插件模式应用到本项目中,以达到客户可以自己动态增加相关功能的目的,然后我们就根据需求制定出接口,再由客户自己实现接口,通过项目提供的相应界面将实现的jar包上传,由服 ...

  9. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

最新文章

  1. phpcms V9判断奇数偶数的实例
  2. 第三篇:属性_第二节:控件属性在页面及源码中的表示方式
  3. 字符串删除首尾_[LeetCode] 459. 重复的子字符串
  4. 【使用jdbc和servlet实现阅览文章访问次数】
  5. java反射学习(2):反射与代理模式
  6. C语言的变量怎样重启后不变,求解释,怎么能让程序里的变量在关闭后依然保存呢?...
  7. 【clickhouse】clickhouse INSERT INTO 语句
  8. VLC播放电视直播rtmp流地址
  9. 电子信息工程专业实习手册周记_信息专业实习周记范文
  10. 前端工程师和python工程师收入哪个高_前端工程师和后端工程师工资哪个高
  11. 给uiview设置圆角
  12. 神经机器翻译中的曝光偏差,幻觉翻译与跨域稳定性
  13. XtraReport绑定数据源的三种方式
  14. 带你了解现在的LED显示屏技术
  15. excel批量提取网页标题
  16. Logstash:如何处理 Logstash pipeline 错误信息
  17. 武候祠:一千七百年的沉思
  18. 申请国外博士后的好网站
  19. FairGuard anti-cheat 反外挂方案解析
  20. IOS指纹/面容识别,TouchID/FaceID验证

热门文章

  1. at91sam7x256编程c语言代码,at91sam7x256的程序串口0问题
  2. matlab添加路径报错,Win10 + Caffe + CPU + MATLAB (包括各种问题详细解决)(二)
  3. 考点图文详解 - 数据通信基础(第二章)
  4. 程序包lombok不存在
  5. with open ()as f 读写操作
  6. 定义一个汽车类Car
  7. CCRC信息安全服务资质申请要求
  8. Android apk发生crash : Fatal signal 4 (SIGILL), code 1 (ILL_ILLOPC)
  9. LINUX 构建PXE一键装机平台
  10. CCD 芯片与CMOS 芯片的主要参数有哪些