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. [SD心灵鸡汤]006.每月一则 - 2015.10

    1. 贫不足羞,可羞是贫而无志. 2. 艺术的大道上荆棘丛生,这也是好事,常人望而却步,只有意志坚强的人例外. 3. 古今中外,凡成就事业,对人类有作为的无一不是脚踏实地.艰苦攀登的结果. 4. 理想 ...

  2. 03.Django-ORM

    ORM 1. 数据库配置 配置使用sqlite3,mysql,oracle,postgresql等数据库 sqlite3数据库配置 DATABASES = { 'default': { # 默认使用的 ...

  3. Burpsuite代理socks流量

    一 设置sock代理 二 设置浏览器代理 三 设置burpsuite代理 四 浏览器访问验证 总结:增加取证难度,隐藏你自己ip,别光着屁股跑了O-O!

  4. Codeforces Round #646 (Div. 2)【B. Subsequence Hate题解】

    具体思路已经在代码注释中给出,这里不再赘述. #include<iostream> #include<algorithm> using namespace std; int t ...

  5. Rocket - interrupts - Parameters

    https://mp.weixin.qq.com/s/eD1_hG0n8W2Wodk25N5KnA 简单介绍interrupts相关的Parameters. 1. IntRange 定义一个中断号区间 ...

  6. linux 最基本的命令

    1.说一些你比较常用linux指令 1.1.ls/ll.cd.mkdir.rm-rf.cp.mv.ps -ef | grep xxx.kill.free-m.tar -xvf file.tar.(说那 ...

  7. Java实现 LeetCode 793 阶乘函数后K个零 (分析)

    793. 阶乘函数后K个零 f(x) 是 x! 末尾是0的数量.(回想一下 x! = 1 * 2 * 3 * - * x,且0! = 1) 例如, f(3) = 0 ,因为3! = 6的末尾没有0:而 ...

  8. Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  9. Java实现 LeetCode 500 键盘行

    500. 键盘行 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", & ...

  10. Java实现 蓝桥杯 算法提高 7-1用宏求球的体积

    算法提高 7-1用宏求球的体积 时间限制:1.0s 内存限制:256.0MB 问题描述 使用宏实现计算球体体积的功能.用户输入半径,系统输出体积.不能使用函数,pi=3.1415926,结果精确到小数 ...