1、避免深分页操作
es是一个搜索引擎,所以如果用这个搜索引擎对大量的数据进行搜索,并且返回搜索结果中排在最前面的少数结果,是非常合适的。
类似于后台下载功能,如果要做成类似数据库的东西,每次都进行大批量的查询,是很不合适的。如果真的要做大批量结果的查询,记得考虑用scroll api。
2、避免业务稀疏数据
请参考 Elasticsearch调优篇 05 - Elasticsearch 搜索层面最全优化 第 9 条 避免稀疏数据,要从实际业务中将这类问题避免掉。
3、高亮性能优化
es 默认的高亮模式为 plain,可选的有 posting 和 fvh(fast vector highlighter)
我们当前业务都是对比较大的文本进行高亮摘取,适合选取后两种高亮方案。
如果线上服务器有足够的磁盘空间以及好的磁盘性能例如 SSD 磁盘,那么可以选用 fvh 模式进行高亮
可参考博客:ElasticStack系列之十七 & 大文本搜索性能提升方案
4、高亮效果优化
以第一篇攻略为例,query= 冬季去俄罗斯好玩吗
- 正文里面明明含有“俄罗斯”和“冬季”, 但是偏偏高亮出了“去”
- 还有一个情况,即使高亮正常,但是高亮的文本不能漏出,被后面的 “...”给覆盖了,也就是不同手机屏幕长宽不同,显示字数不同
所以,这严重影响“用户决策”,让用户感觉有些莫名其妙,用户体验不好。
【做好高亮摘要的意义】:是加速用户觉得关键信息
- 让用户知道这个文章为什么会出现
- 让用户快速知道文章的缩略内容
【实现思想】:
- 让token尽量大的比例出现在摘要中(重复token不算增加比例)
- 让重要token尽可能的出现在其中
【当前高亮摘要的具体问题点】:
长度问题: 调研动态摘要算法,来让真正有效的内容进行漏出,辅助用户决策
【答】: 进行动态摘要算法后,可以请客户端传入一个参数,这样就能自适应屏幕尺寸
性能问题: 如果拿出单独做,性能怎么保证
【答】: 放弃全部取出数据的方案,借助ES的高亮功能,扩展召回范围,然后在这个基础上实现自定义的句子摘要算法
具体方案实现要点:
- 基于ES倒排大幅缩短文本量
- 利用query理解系统 分析query的token要素成分
- 结合query分析 对文档的段落进行重要性排序
- 利用动态滑动窗口 方法来寻找 段落中的最优句子窗口
- 利用核心token 匹配程度,动态决定 众多最优句子窗口 如何组合成一个句子
- 返回这个句子,做token的高亮
以上为具体的设计与实现方案,只是提供一种解决思路,具体的因人而异。这里简单再总结一下:
问题引入:
1. 即使我们通过 dev tools 查看对应核心词高亮别提取出来了,但是 app 展示的时候展示不全,体验不友好
2. es 高亮模块无法指定必须高亮的核心词,即做不到我们想要高亮的内容就一定会高亮
解决办法:
第一个问题:
<1. 通过 app 传入对应型号 或 屏幕大小,来计算出大概可以展示的字数
第二个问题:
<1. 继续使用 es 高亮模块,采用提取多段以及更多的文字。例如:提取 10 端高亮文本,每段字数为 2 倍的屏幕展示字数,假定为 40 个字。
<2. 根据已知的展示字数指定滑动窗口大小,例如:滑动窗口大小设定为已知字数的一半或者其他,可以自由定义。
<3. 针对以上提取到的文本使用 滑动窗口 的技术进行打分。例如:核心词出现的个数越多分数越高,核心词越靠前出现分数越高,对应滑动窗口段落分值越高
最终通过组合最高分数的滑动窗口段落来组成最终展示给用户的动态高亮摘要。