lucene 弹性查询中文档更新的效率

cetgtptt  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(185)

我已经成功地使用elasticsearch一年左右了,我已经加载了数百万个文档,并对数据运行了各种查询和方面。
最近,我的一些用户问我,是否可以“将文档标记为已读”,这样就可以将它们从搜索结果中排除。
我已经成功地实现了这一点,但现在我想知道我是否选择了最好的实现。我的理解是,在ES(或任何lucene实现)中更新文档实际上与删除和重新索引是一样的。
我对lucene/ES社区的问题是......将文档更新作为一个用户驱动的临时任务会有任何负面影响吗?(你能建议一个替代方案吗?)
谢谢JayTee

x6492ojm

x6492ojm1#

是的,重建索引会有性能开销。这在https://www.elastic.co/blog/managing-relations-inside-elasticsearch中被认为是“不可忽略的”(这里讨论的是嵌套的文档,但在普通文档(没有嵌套字段的文档)上更新字段是相同的
如果您的数据经常更改,则嵌套文档可能会产生与重新编制索引相关的不可忽略的开销。
本文后面给出了另一种选择-即Parent/Child
“父项/子项”会将两个文件分开,并仅将它们松散耦合,借此移除此限制...这表示您可以更自由地更新/删除子项文件,因为它们不会影响父项或其他子项。
缺点是......(查询)......速度不太快......因为它们不是位于同一个Lucene块中。”
因此,如果你拥有的每一个文档最终都将被更新为“读取”--这将涉及到重新索引整个数据存储的开销。如果这将随着时间的推移而缓慢发生,也许你的体系结构可以处理它。
如果您担心大量文档可能被标记为已读,这将给您的系统带来很大的负载,您可以对read字段使用父子关系。但是,运行查询“只给予子字段'read'为false的文档”将有(据我所知,这是一个小的)额外开销。

相关问题