59.bouncing results
一、bouncing results成因及解决方案
bouncing results问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询路由到不同的replica shard上;每次页面上看到的搜索结果的排序都不一样。这就是bouncing result的问题,这个问题出现最多的地方就是timestamp进行排序
比如当你使用一个timestamp字段对结果进行排序,因为es中时间格式为%Y-%m-%d,那么同样时间的数据会有很多。es如果不做任何设置,将会按round-robined的方式从primary和replica里取了再排序,这样结果就不能保证每次都一样的。毕竟primary有的relica里不一定有,尤其是在不停往es里存放数据的情况,如果有两份文档拥有相同的timestamp。因为搜索请求是以一种循环(Round-robin)的方式被可用的分片拷贝进行处理的,因此这两份文档的返回顺序可能因为处理的分片不一样而不同,比如主分片处理的顺序和副本分片处理的顺序就可能不一样。这就是结果跳跃问题:每次用户刷新页面都会发现结果的顺序不一样。
解决方案就是将preference设置为一个字符串,为相同用户指定同样的分片来避免,比如说user_id,让每个user每次搜索的时候,都使用同一个replica shard去执行,就不会看到bouncing results了
search_result = es.search(index=index_name,
body=search_body, preference="primary")
二、preference可用的参数
_primary, _primary_first, _local, _only_node:xyz, _prefer_node:xyz, _shards:2,3
三、search_typ
default:query_then_fetch(默认)
dfs_query_then_fetch,可以提升revelance sort精准度(可以手动指定)
四、延伸阅读
最新文章
- 用soapUI测试webservice
- 虚拟机下Linux读取USB设备的问题虚拟机下Linux无法读取USB设备的解决方案
- Jquery validate插件使用方法详解
- IDataReader转换成list通用方法
- 利用Highcharts制作web图表学习(二)
- SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别
- 在python中编写socket服务端模块(二):使用poll或epoll
- oracle rman异机恢复
- Drop dual
- 企业架构研究总结(34)——TOGAF架构内容框架之架构制品(下)
- enode框架step by step之框架要实现的目标的分析思路剖析1
- golang命令行库cobra的使用
- Anaconda换源小记
- 【bzoj 1492】[NOI2007]货币兑换Cash
- Guava cache 示例
- redis启动
- BGP - 3,BGP重要概念(EBGP,IBGP,防环/黑洞/全互连/同步)
- 使用ffmpeg从mp4文件中提取视频流到h264文件中
- oracle 批量更新merge语句
- -bash: locate: command not found