弹性搜索中更新文档的效率

时间:2014-01-17 11:20:00

标签: java lucene nosql elasticsearch

我一直在成功使用elasticsearch一年左右,我已经加载了数百万个文档,并针对数据运行各种查询和方面。

我的一些用户最近曾询问我是否可以“将文档标记为已读”,因此可以将其排除在搜索结果之外。

我已成功实现了这个问题,但现在我想知道我是否选择了最佳实现。我的理解是,在ES(或任何lucene实现)中更新文档实际上与删除和重新索引相同。

我向lucene / ES社区提出的问题......作为用户驱动的特殊任务更新文档会对他们产生任何负面影响吗? (你能提出另一种选择吗?)

谢谢, JayTee

1 个答案:

答案 0 :(得分:1)

是的,重新编制索引会产生性能开销。这在http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/给出“不可忽略”(这里讨论的是嵌套文档,但更新普通字段(没有嵌套字段的文档)是相同的

“如果您的数据经常更改,嵌套文档可能会产生与重建索引相关的不可忽略的开销。”

该文章稍后将提供另一种选择 - 即父母/子女

“父/子通过分离两个文档来删除这个限制,只是松散地耦合它们...意味着您可以更自由地更新/删除子文档,因为它们对父项或其他子项没有影响。

缺点是......(查询)..并不是那么快..因为它们没有位于相同的Lucene块中。“

因此,如果您拥有的每个文档最终都会更新为“读取” - 这将涉及重新索引整个数据存储区的开销。如果这会随着时间的推移缓慢发生,也许你的架构可以处理它。

如果您担心大量文档可能被标记为已读,并且会在您的系统上产生大量负载,则可以使用父子关系作为读取字段。但是(我理解一个未成年人)运行查询会产生额外的开销“只提供子字段'读'为假的文档”

相关问题