性能测试持续学习 开放搜索性能-搜索 (转自阿里云)

会飞的猪 · 2019年02月12日 · 927 次阅读

备注来自阿里云:https://help.aliyun.com/document_detail/29191.html?spm=a2c4g.11186623.6.724.311266f00WJQ6H
监控报警: https://help.aliyun.com/document_detail/71854.html?spm=a2c4g.11186623.6.733.683267bdVb0zg6

这里主要介绍在实际查询过程中可能遇到的各种情况,及可以优化的方法。当您发现自己的搜索效果不满意或者不知道该如何实现,请联系我们。

搜索查询的效果主要跟 query 关键词中命中的文档数有关,命中的文档数越多,系统要进行的计算就越多,那么耗时就会越高。所以优化的一个重要手段就是尽量降低 query 召回的文档数。

查询需要带上索引名(应用结构中的 “索引到” 字段),否则将默认取 default 索引,如果没有 default,则直接报错无结果。
试用
query='mp3'相当于 query=default:'mp3'

查询关键词必须带上单引号,否则很可能会报错无结果。
试用

Error: query=default:mp3
Right: query=default:'mp3'

如果查询词中包含’,则需要转义或者去掉;2,查询词的最后一个字符不能是’\’,否则会被当成转义符从而查询报错,如果要搜索’\’,需要对’\’ 进行转义。
试用

query=default:'北京大学',召回同时包含 “北京” 和 “大学” 的文档;
query=default:'abc's efg'会解析失败无结果,需要修改为'abc\'s efg';
query=default:'abc\',会查询报错无结果,\对'进行了转义,到时引擎解析失败;

对于只用来做过滤筛选的需求,建议尽量将过滤字段建索引,通过 query 子句来查询,可以提高性能。
试用

query=user_id:'123'&&filter=type_id=1,改写为 query=user_id:'123' AND type_id:'1'。

如果某些 query 召回量非常大,那么检索的效果低很多,这时候放在 filter 中可能效果更好。
试用

query=status:'1' AND user_id:'123' //符合 user_id=123 的有 100 条记录,符合 status=1 的有 5kw 文档,
改写为
query=user_id:'123'&&filter=status=1 //这样召回量会小很多,通过 filter 来过滤会更快。

在一些情况下,会查询近一个月的数据,目前系统不支持 query 的 range 查询,如果数据量较大,性能比较差,可以考虑增加一个月份字段,适当降低 query 的召回文档量,可以有效提高查询效率。
试用

query=user_id:'123'&&filter=time>"2016-09-16" //符合 user_id=123 的有 5 千万数据,但是根据时间过滤完只有 1 千。query 召回量太大,很容易超时
可以改为:
query=user_id:'123' AND (month:'201610' OR month:'201609')&&filter=time>"2016-09-16" //这样符合 user_id:'123' AND (month:'201610' OR month:'201609') 的只有 2000,再做具体时间过滤效率会高很多。

查询到具体的文档后,引擎会去获取实际要返回的结果数据,如果结果数据较大,那么消耗的时间也会越大。这时,可以从哪个方面入手:1,降低 hit 数,一般翻页结果为 20 个;2,修改默认展示字段或者 fetch_fields,仅返回搜索结果展示中需要的字段即可。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册