软删除,在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 其它原因?
哪一种啊?
图片与主题无关
从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 其它原因?
哪一种啊?
图片与主题无关
3 个回复
Ombres
赞同来自: Charele
DirectoryReader.open(directory)和 DirectoryReader.open(indexcommit)不会过滤这些文档
DirectoryReader.open(indexwriter )及另外一个,可以通过indexwriterconfig的具体信息,过滤掉softdelete的文档
spoofer
赞同来自:
Charele - Cisco4321
赞同来自:
我做了个测试,在ES插入一个文档,然后又删除了这个文档
ES里面肯定是查不到了
(现在有两个段)
然后用Lucene打开了分片,的确,文档还在,可以查到。
什么原因导致ES看不到呢