bouncing results问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询打到不同的replica shard上;每次页面上看到的搜索结果的排序都不一样。这就是bouncing result,也就是跳跃的结果。

比如当你使用一个timestamp
字段对结果进行排序,有两份文档拥有相同的timestamp。因为搜索请求是以一种循环(Round-robin)的方式被可用的分片拷贝进行处理的,因此这两份文档的返回顺序可能因为处理的分片不一样而不同,比如主分片处理的顺序和副本分片处理的顺序就可能不一样。
这就是结果跳跃问题:每次用户刷新页面都会发现结果的顺序不一样。
这个问题可以通过总是为相同用户指定同样的分片来避免:将preference
参数设置为一个任意的字符串,比如用户的会话ID(Session ID)。让每个user每次搜索的时候,都使用同一个replica shard去执行,就不会看到bouncing results了

对于preference

偏好这个参数 preference 允许 用来控制由哪些分片或节点来处理搜索请求。 它接受像 _primary, _primary_first, _local, _only_node:xyz, _prefer_node:xyz, 和 _shards:2,3 这样的值, 这些值在 search preference 文档页面被详细解释。

但是最有用的值是某些随机字符串,它可以避免 bouncing results 问题。

例如,使用用户的会话ID xyzabc123,如下所示:

GET /test_index/_search?preference=xyzabc123
{
"query": {
"match": {
"test_field": "hello"
}
}
} {
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"skipped" : ,
"failed" :
},
"hits" : {
"total" : {
"value" : ,
"relation" : "eq"
},
"max_score" : 0.20521778,
"hits" : [
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "",
"_score" : 0.20521778,
"_source" : {
"test_field" : "hello, how are you"
}
},
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "",
"_score" : 0.16402164,
"_source" : {
"test_field" : "hello you, and world is very good"
}
}
]
}
}

https://www.jianshu.com/p/c25abefd7d2b

以前使用elasticsearch,排序上设定了以时间+score的排序方式:

sort_setting = [
{"pub_date": {"order": "desc"}},
{'_score': {"order": "desc"}},
]

搜索结果也一直没有问题。但是最近一个项目,通过爬虫爬取后的数据不停的入ES。同样的搜索条件返回的不同的结果。

下面就是分析思路:

1.排除es集群的问题,因为之前遇到过es设置不对,导致同一查询在不同节点返回的结果不一致的情况。把es的hosts设置为单一主机,结果仍然是会变化。
2.限定查询的时间范围,如果日期的上线为今天,那么不停入库的数据肯定会导致结果的变化,限定为过去的时间段后,毫无改善。
3.去掉pub_date排序字段,限定为按关联度排序,毫无改善。
4.最后居然开始怀疑merge的问题,使用forcemerge,结果表示没啥用。

这个时候我才意识到了文档里提过的Bouncing Results问题。因为时间格式为%Y-%m-%d,那么同样时间的数据会有很多。es如果不做任何设置,将会按round-robined的方式从primary和replica里取了再排序,这样结果就不能保证每次都一样的。毕竟primary有的relica里不一定有,尤其是在不停往es里丢数据的情况。

最后解决方法也很简单,直接设置preference为primary即可

search_result = es.search(index=index_name,
body=search_body, preference="primary")

最大的担心就是这样会有性能问题,不过没时间来测。

elasticsearchBouncing Results问题的更多相关文章

  1. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  2. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  3. web api :Action Results in Web API 2

    原文:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results Web api 返回 ...

  4. Snippet: Fetching results after calling stored procedures using MySQL Connector/Python

    https://geert.vanderkelen.org/2014/results-after-procedure-call/ Problem Using MySQL Connector/Pytho ...

  5. ios8调用相机报警告: Snapshotting a view that has not been rendered results in an empty snapshot. Ensure you(转)

    我这也报了这个警告,但按他的方法并没有起作用,把写到这个地方看是否其他人用的到 错误代码:Snapshotting a view that has not been rendered results ...

  6. [计算机取证技术] VDI-in-a-Box Analysis Results

    原文跳转: http://dig4n6.blogspot.tw/2013/07/vdi-in-box-analysis-results.html *文中引用图片如无法浏览,请科学上网* VDI-in- ...

  7. 《Diagnostic use of facial image analysis software in endocrine and genetic disorders: review, current results and future perspectives》学习笔记

    <使用面部图像分析软件诊断内分泌和遗传疾病:回顾,当前研究结果以及未来展望> Abstract 库欣综合征(CS)和肢端肥大症普遍是在发病后几年才能被诊断出的内分泌疾病.现在需要新的诊断方 ...

  8. [ORACLE错误]oracle 不能更新 PL/SQL 点击“edit data”报“ these query results are not updateable”

    你可以选择在查询语句的最后加上 for update,就可以打开编辑锁,直接修改数据. 而在默认查询下,点击Edit data,会报错:The query results are not update ...

  9. read the python code and predict the results --- from <Learn Python The Hard Way>

    import random from urllib import urlopen import sys WORD_URL = "http://learncodethehardway.org/ ...

随机推荐

  1. Pycharm虚拟环境的使用

    Pycharm虚拟环境的使用 pycharm创建项目的时候,一定勾选inhert global site-packages.不然系统的库就没法用了. 打开Project Interpreters页面: ...

  2. 深度学习入门: CNN与LSTM(RNN)

    1. 理解深度学习与CNN: 台湾李宏毅教授的入门视频<一天搞懂深度学习>:https://www.bilibili.com/video/av16543434/ 其中对CNN算法的矩阵卷积 ...

  3. 七、Spring MVC高级技术

    知识点 处理文件上传 使用flash属性 在控制器中处理异常 关键词 控制器通知 (Controller Advice) 7.1 处理异常 Spring提供了多种方式将异常转换为响应: 特定的Spri ...

  4. [Python3]踩坑实录-优化技巧1

    选择合适的数据结构 考虑不同的应用场景,应选择不同的数据结构 比如在查找多于插入的场景中,考虑字典Dict是不是更适合; 因为在Python3中, 字典Dict 通过hash把key映射到hash t ...

  5. IDEA字节码学习查看神器jclasslib bytecode viewer介绍

    转载来自:https://blog.csdn.net/w605283073/article/details/103209221 一.背景 很多人想学习Java反汇编后的字节码,但是一方面缺乏好的资料, ...

  6. Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛

    有错误的或者有问题的欢迎评论 十六进制数1949对应的十进制数 19000互质的数的个数 70044与113148的最大公约数 第十层的二叉树 洁净数 递增序列 最大的元素距离 元音字母辅音字母的数量 ...

  7. Java实现 LeetCode 999 车的可用捕获量(简单搜索)

    999. 车的可用捕获量 在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 "R"," ...

  8. Java实现BFS广度优先查找

    1 问题描述 广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边的所有未访问顶点,以此类推,直到所有与初始顶点同在 ...

  9. Java实现第十届蓝桥杯旋转

    试题 F: 旋转 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 [问题描述] 图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时 针旋转 90 度. 我们用一个 ...

  10. 08_提升方法_AdaBoost算法

    今天是2020年2月24日星期一.一个又一个意外因素串连起2020这不平凡的一年,多么希望时间能够倒退.曾经觉得电视上科比的画面多么熟悉,现在全成了陌生和追忆. GitHub:https://gith ...