一、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精准度(可以手动指定)

 
 

四、延伸阅读

分步式搜索过程

最新文章

  1. 用soapUI测试webservice
  2. 虚拟机下Linux读取USB设备的问题虚拟机下Linux无法读取USB设备的解决方案
  3. Jquery validate插件使用方法详解
  4. IDataReader转换成list通用方法
  5. 利用Highcharts制作web图表学习(二)
  6. SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别
  7. 在python中编写socket服务端模块(二):使用poll或epoll
  8. oracle rman异机恢复
  9. Drop dual
  10. 企业架构研究总结(34)——TOGAF架构内容框架之架构制品(下)
  11. enode框架step by step之框架要实现的目标的分析思路剖析1
  12. golang命令行库cobra的使用
  13. Anaconda换源小记
  14. 【bzoj 1492】[NOI2007]货币兑换Cash
  15. Guava cache 示例
  16. redis启动
  17. BGP - 3,BGP重要概念(EBGP,IBGP,防环/黑洞/全互连/同步)
  18. 使用ffmpeg从mp4文件中提取视频流到h264文件中
  19. oracle 批量更新merge语句
  20. -bash: locate: command not found

热门文章

  1. 深入理解Android开发中的CoordinatorLayout Behavior
  2. 【POJ 3764】 The xor-longest path
  3. MYSQL 数据库命令行终端操作笔记
  4. log4net实用配置代码
  5. Java 介绍比较全面的一遍文章
  6. 5.30获取openid和createTime--mybatis自动生成接口和映射【这里需要自定义】
  7. create-react-app 引入ant design 及 使用 less
  8. hibernate_02_session介绍
  9. python3设置打开文件的编码
  10. AMQP及RabbitMQ