绊脚石乃是进身之阶。

关于软删除的疑问啊啊啊

Elasticsearch | 作者 Charele | 发布于2023年08月10日 | 阅读数:1151

软删除,在ES中用到。
 
 从Lucene的角度来说明这个问题。
在Lucene里面,我发现用softUpdateDocuments()执行软删除后,
如果显式的不merge,(通过.setMergePolicy(NoMergePolicy.INSTANCE))
我还是能查到这些数据的,
 
只有我显式的执行merge后,这些数据才会“查不到”,
这跟我想的不一样啊,我的想法是软删除他也是删除,
就不应该查到数据。
 (数据在不在硬盘上是另外一回事,但至少你不应该让我用search() API查到)
 
 结果集查到查不到,这好像不应该于依赖于merge吧。
 
除了手动去执行forceMerge(),
Lucene的内部也会执行merge,这种内部merge是不可控的(你不知道它啥时会执行一下下)
 所以当你执行软删除后,查询结果是不确定的

 
  
 好,回到ES上来(开启软删除的情况)
 
当我在ES删除一个文档后,且执行了refresh(手动或自动都行)后
肯定是查不到这条数据了。
 
 但为什么不会出现上面的情况而查到数据呢,
 
我能想到的可能 
1 在ES refresh时,它执行了merge功能?
2 在ES search执行时(或返回的结果集里),它屏蔽了这条数据,所以看不到
3 其它原因?
 
哪一种啊?
 
 
图片与主题无关
222.PNG
已邀请:

Ombres

赞同来自: Charele

这是lucene的机制
DirectoryReader.open(directory)和 DirectoryReader.open(indexcommit)不会过滤这些文档

DirectoryReader.open(indexwriter )及另外一个,可以通过indexwriterconfig的具体信息,过滤掉softdelete的文档
 
 

spoofer

赞同来自:

哥,这个es的版本是多少?“开启软删除的情况”是如何开启的?是哪条指令?

Charele - Cisco4321

赞同来自:

111.PNG

 
我做了个测试,在ES插入一个文档,然后又删除了这个文档
ES里面肯定是查不到了
(现在有两个段)
 
然后用Lucene打开了分片,的确,文档还在,可以查到。
 
什么原因导致ES看不到呢

要回复问题请先登录注册