es相同条件搜索多次返回结果不一样
1. 背景介绍
业务方发现他们配置的数据源会返回重复数据,主要体现为在翻页的时候上一页的最后一个数据和下一页的第一条数据一模一样, 场景和分页问题极其相似
2. 分析过程
我最开始碰到这个bug的时候,就真的是以为只是翻页的问题,现象太容易引人误会了. 结果我肉眼从接口到代码到排查代码传参都没问题.于是决定预发环境DEBUG,发现参数确实传输中没有问题,那么代码问题就被排除,只可能是基建问题. 于是我拿到真正执行的DSL, 直接去es中搜索, 发现同一条DSL,短时间诶查询的结果不一样.
(注意: 我配置的 index refresh_interval为300s,可以排除是refresh数据导致的问题)
3. 解决思路
既然已经分析出问题,那么就开始研究es为什么相同DSL多次查询结果不一致.可是对于我这个对es底层研究不够深入的半吊子开发,想从原理上去寻找问题几乎不太可能.
于是我把目标瞄准了es开放社区.[https://elasticsearch.cn/]
果然,在社区中早就有前人已经爬过这个坑了,我完全可以直接抄作业了!
4. 原理分析
出于性能考虑es在删除数据的时候,不会立即将数据从磁盘中删除,而是先将数据标记为已删除,然后在下次文档合并的时候才会将数据从磁盘上清楚.因此,假设主碎片刚刚完成了一个大型合并,删除了许多已删除的文档,那么它的索引统计信息可能与副本(仍然有大量已删除文档)完全不同.
于是当我们两次DSL查询走了不同的分片,查询到数据的排序结果自然不会完全相同, 所以会出现搜索结果出现重复数据的情况.
5. 解决方案
es官方给出了,让我们配置userId或者sessionId作为preference(相同的值会从相同的分片中查询数据),可以解决此排序问题.
但是, 基于我对es的认知以及公司大佬carl的实践,不通的查询条件走不通的分片,可以更好的命中es的热数据,大大降低服务器的CPU消耗.所以我将除了start和limit的查询条件的hashcode作为preference值来解决此问题
5. 代码参考
if(cmd.getBody() != null) searchRequest.preference(cmd.getBody().toString().hashCode()+"");
6. 监控数据
7. 参考文献
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/consistent-scoring.html
es相同条件搜索多次返回结果不一样相关推荐
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- 极兔一面:10亿级ES海量搜索狂飙10倍,该怎么办?
背景说明: ES高性能全文索引,如果不会用,或者没有用过,在面试中,会非常吃亏. 所以ES的实操和底层原理,大家要好好准备. 另外,ES调优是一个非常.非常核心的面试知识点,大家要非常重视. 在40岁 ...
- 实习周报 | 3rd week | 2021.4.19 - 4.23 | 文本摘要,ES语义搜索,SOTA SA
完成 ES语义搜索dense vector⽅法可行性进一步测试 新数据集:https://www.kaggle.com/asd336655/ccf2019news-so 新闻评论等,筛选出评论⻓长于5 ...
- Elasticsearch(038):es中搜索之入门与分页搜索
ES中搜索的方式分为两种,一种是通过URL参数进行搜索:另一种是通过POST中body请求参数进行搜索. 针对第一种我们进行简单的讲解,我们关注的核心放在第二种上面. 一.简单搜索(search) 1 ...
- 京东API开发系列:京东按关键字搜索商品 API / item_search - 按关键字搜索商品 API返回值说明
为了进行电商平台京东的API开发,首先我们需要做下面几件事情. 1)开发者注册一个账号 2)然后为每个京东应用注册一个应用程序键(App Key) . 3)下载京东API的SDK并掌握基本的API基础 ...
- 阿里妈妈API开发系列:item_search-按关键字或网址搜索商品API 返回值说明
为了进行电商平台阿里妈妈的API开发,首先我们需要做下面几件事情. 1)开发者注册一个账号 2)然后为每个阿里妈妈应用注册一个应用程序键(App Key) . 3)下载当当API的SDK并掌握基本的A ...
- ES 全文搜索与数据分析引擎
ES 它是一个 分布式的 全文搜索与数据分析引擎. 与关系型数据库对比: 一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(表),类型中包含了很多文档(行),每个文档使用 JSON 格 ...
- ES多种搜索方式总结
本节使用的是ES低版本,包含type. 分类 query string search query DSL query filter full-text search phrase search hig ...
- ES中搜索结果各属性说明介绍,以及搜索中的timeout机制讲解(来自学习资料,34节)
1.属性说明和介绍 执行命令: GET /test_index/test_type/_search?timeout=1s 运行后的结果如下: {"took": 4,"ti ...
最新文章
- 京东金融科技学堂开班,AI 在金融云上有了新成果
- 前端常用效果(2)带效果的tab切换
- oracle oem 监控,DBA手记:OEM罪几何?-空间监控的性能问题
- shell中各种美元符号组合
- 如何启用SAP CRM text的html编辑器
- c#endread怎么打印出来_NetworkStream.EndRead(IAsyncResult) 方法 (System.Net.Sockets) | Microsoft Docs...
- 11.4 专利法与反不正当竞争法解读
- rust怎么传送到队友_王者荣耀原初法阵怎么传送?原初法阵最多传送几个人?...
- Windows 新漏洞可被用于强制服务器以攻击者身份认证,官方缓解措施已发布
- 想做好seo优化,关键词的选择可是重中之重!
- 【业界】百度NLP十年技术积累,最新发布5款产品,公布两大计划
- python 遍历文件夹文件代码
- 核磁共振测量动物脂肪、水分、瘦肉、代谢
- GeeM2传奇引擎进入游戏出现白屏的解决办法
- 女生学软件测试难不难 培训出来能找到工作吗?
- MATLAB | MATLAB中绘图的奇淫技巧合集
- Floorplan后端概念合集
- Witkey威客平台测评
- 2021年安全员-A证-主要负责人(广东省)考试APP及安全员-A证-主要负责人(广东省)考试试题
- 利用GF-1 WFV数据估算西北地区地表反照率