es同一次搜索请求获得不同结果

关键词: elastic search,


今天,做了这样一个简单的搜索,es2.4.1:

POST  http://127.0.0.1:9001/mp_alias_v2/news/_search
{
    "query":{
        "term":{
            "cityId" : 1
        }
    }    
}

通过postman发送请求,但是会获得两种搜索答案。


结果1

结果2

产生现象的原因

es中主副分片进行refresh过程是相互独立的,当批量持续写入数据时,主副分片中的数据不是严格一致的。 所以同个搜索多次执行的时候,在主副分片来回执行会导致结果“跳动”的情况。
使用preference参数指定搜索的分片就可以保证一次搜索只有一次结果。

POST  http://127.0.0.1:9001/mp_alias_v2/news/_search?preference=_primary
{
    "query":{
        "term":{
            "cityId" : 1
        }
    }    
}

上面我们指定了主分片进行搜索,只得到一种搜索结果。也可以换成preference=_replica,得到的就是另一种结果了。

官方解释的理解

官方文档有对主副片之间统计信息不一致的问题的解释。
Now why is it a problem? Index statistics are an important part of the score. And these index statistics may be different across copies of the same shard due to deleted documents. As you may know when documents are deleted or updated, the old document is not immediately removed from the index, it is just marked as deleted and it will only be removed from disk on the next time that the segment this old document belongs to is merged. However for practical reasons, those deleted documents are taken into account for index statistics. So imagine that the primary shard just finished a large merge that removed lots of deleted documents, then it might have index statistics that are sufficiently different from the replica (which still have plenty of deleted documents) so that scores are different too.

意思是当索引有update/delete一类操作的时候,旧文档不是马上被删除的,实际的删除操作发生在一些segment合并(merge操作)的阶段。而主副分片的segment合并完全是各不想干独立进行的,所以还未删除的旧文档是不一致的。 而出于一些实际因素的考虑,还未物理删除的文档,也是shard统计信息的一部分,这样就会导致不同分片可能存在打分的差异。

通过指令 http://127.0.0.1:9001/_cat/shards
查看该索引mp_alias_v2的每个分片上文档数和每个分片上所有segment文件所占空间。

image.png

记录数是统一的。p1分片==r1分片==1122621条。p0和r0也是如此。
但是segments所占空间是不同的,有一些被删除的segment还未被实际删除掉。

那这些多余的segement文件会影响打分吗?
会的。

我们知道filter不会影响query的算分,那我将查询内容改成如下

POST  http://127.0.0.1:9001/mp_alias_v2/news/_search
{
    "query":{
        "term":{
            "cityId" : 1
        }
    }    ,
    "filter":{
        "term":{
            "id" : 4445541
        }
    }
}

这样的查询中,只有query部分是算分的,filter不会影响算分。
会得到id=4445541这篇文章的内容,但是有两个算分1.0631204 和1.0596588,说明多余的segment会影响最终的算分。
当没有指定排序字段时,默认按照打分从高到低排序,得分1.0596588必定被排在了后面。

当算分一致的情况呢?

对于score一样的匹配文档,ES是按照doc ID序返回。 同一个文档写入主副分片的doc ID并不是完全一致的,当要求返回TOP N的文档时,就可能存在主副分片给的结果不一致。
要注意区分es字段_id和segment file中的 docID。

  • _id是ES设计的一个特殊字段,用来标识一个文档在索引里全局唯一的一个id。
  • docID是lucene层面的一个根据文档写入顺序递增的一个顺序id,倒排索引的post list里存的就是这个id,是lucene内部用来寻址文档位置的一个id。docId是lucene内部设计,ES不对外暴露。
    比如用filter代替query进程搜索时,filter是不算分的。默认就会按照docId来排序。
    可以试试这个查询。
POST  http://127.0.0.1:9001/mp_alias_v2/news/_search
{
    "filter":{
        "term":{
            "cityId" : 1
        }
    }  
}

filter是不算分的,所有的返回结果不会按照算分排序,会按照es中docId的顺序返回结果。主副分片中docId顺序不一致会导致同一次搜索有两个结果。

如何保证主副分片数据一致

将副本分片调整成0,然后再调整回原来的参数。
通过指令 http://127.0.0.1:9001/_cat/shards 查看


对应的主副分片大小是一致的,一次检索只会返回一个结果。


参考:https://elasticsearch.cn/question/3090
感谢kennywu76的解释

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • * ES集群会在生产环境被长期实践, 一些重要概念, 包括应用和优化调试方法值得记录分享 * 所以, 会有关于ES...
    君剑阅读 2,174评论 0 0
  • 一、es基本组成 elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的,核心思想...
    Easy的幸福阅读 1,167评论 0 0
  • 写一下个人的es优化经历,主要分下面五个模块, Overview 先来看看es的整体架构图,上面有多个重要模块,今...
    chenfh5阅读 5,497评论 0 8
  • 一、前情提要 1、versiones 6.4jdk 8 2、 先说下背景,目前公司使用elk 作为日志收集报警一条...
    架构技术专栏阅读 3,374评论 0 51
  • 前几天,卢璞在PMClub微信群(一个专注帮产品经理解决问题的微信群)中问大家怎么看『火车票的排版设计』。这个问题...
    董志鹏阅读 463评论 0 1