赞
踩
搜索服务必备三个点, 完整而丰富的待搜索数据源,搜索引擎(存储搜索数据并且简历关键词索引), 相关语义的理解(解决语句的理解)
推荐系统: 良好的训练测试数据集, 个性化的千人千面的召回排序算法, 可解释且有实际意义的评价指标。
本项目基于一个项目迭代开发,先搭建最简单的线性框架, 最终加入es用于搜索, spark用于推荐。
项目设计:给出需求—- 设计技术方案— 完成具体的实施。
基本技术栈: spring boot + mybatis等。
业务需求方输出BRD, 产品给出用户故事,并将业务需求方的文档翻译成PRD让程序员去开发。
业务需求(需求方将目标、功能、大致效果整理成brd, 表明自己的需求。)
仿造大众点评做H5应用
具备搜索线下门店的服务功能
推荐线下门店服务功能(没有主动搜索欲望和目标)
用户故事(用用户角度把应用将清楚)
打开首页能够查看服务分类
打开首页能够查看推荐的列表
可以通过搜索栏搜索关键字对应的店家, 并各种筛选和排序。
产品PRD(精细化具体功能, 就是一个产品角度的功能拆分)
技术分析
模块设计之业务模块架构设计(要和PRD对称)
注意全量是指所有数据, 增量是指更改的实时数据。推荐的样本其实已经提前计算好了。
异常处理
静态请求
需要自己先要定义好自己的索引结构、字段类型,分词器模式 : 整数id, 智能化分词的店名, 标签,地理位置信息, 点评分数, 类目类型id, 类目类型名, 商家的分数, 商家启动或者关闭状态。
全量索引构建 : 一般我们使用logstash-input-jdbc中间件去将数据库数据搞到es中 , 和elk中e是一样, 起到数据收集功能。 | 这里面有个问题就是如果sql中在执行事务, logstash-input-jdbc拿到的是快照之前的数据,就会出现数据不一致, 这种是可以接受的, 因为搜索不是很强调内容的过于细节的变动,而且增量数据补偿也可以弥补。 | 还是在es中安装logstash-input-jdbc插件— 填写数据库的配置等, 放入sql语句, sql服务器地址, 放入映射关系
增量(实时修改)索引构建: 增量索引就是通过sql语句去搜索更新日期大于* 的内容,然后对这些数据进行更新。 | 我们也是在es中配置中, 然后在之前的全量索引sql语句中加入时间的判断,当大于自己当前的时间, 更新。 | 到这就实现了刚开始更新全量, 后面实时更新增量的工作, 但是其实这个增量还是比较慢, 而且数据量大的时候会出现更新还没更新完, 还要检测, 结果发现还有很多要更新, 我们后面继续优化。
最基本的搜索模型 : 我们根据坐标自定义es语句去计算距离, 然后和搜索的关键字一起定制化打分, 按照分数进行排序 | 这些不同打分权重是根据实际业务去调整的 | 还可以设置关键字只算召回, 排序时候只考虑距离。
注意下面是es的工作流程, 一般es搜索过来的内容取到id, 还要去数据库中再找详细的图片等信息的, es只是负责让你方便的搜, 实际搜索的内容需要用户拿到es返回之后请求sql数据库。
2. java接入 : 一般我们用restful http 去接入es集群 | 先在java项目中加入包, 然后创建配置, 给出http es client 对象, 然后服务端调用http client 服务对象操作数据 | 如下图所示, 这是一个最最简单的es搜索结果
4. 复杂排序模型的java封装 : 前面我们简单的java接入是用的高级api, 用函数封装的。 但是我们实际写的搜索模型是比较复杂的, 因此我们复制已经写好的es语句, 替换里面的变量, 以http的get请求发送过去, 最终得到结果。 | 但是这里面的es语句非常复杂, 如果后序要修改非常麻烦, 因为我们直接传入的json文档, 因此我们可以参照mybatis封装sql语句的操作, 以json对象来封装这些底层的语句。 虽然第一次写非常繁琐, 但是后序修改的时候就不用怎么改了, 能够修改部分会加else留空 | 可以看到我们还能根据目录操作进行过滤了, 整体非常流畅 |
5. 将之前用sql写的标签过滤搞成es过滤 , 用来解决无法识别空格的问题。 至此我们的这个搜索模型可以满足大部分需求的, 整个搜索非常强大了。
6. 额外的改进空间: 分词定制化, 我们需要对凯悦等行业词汇进行专门的定制分词, 对于一些词过滤掉等等 | 相关性 : 对于一些包含语境的词无法理解, 例如我们说休息其实是想搜住宿, 但是我们的带搜索内容中没有休息, 只有和住宿相关的, 而你搜的休息和住宿对于es而言, 没有相关性, 搜不出来。 | 索引实时性: 我们的搜索是一分钟一次, 但是对于高并发的领域太慢了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。