处理ElasticSearch文档内频繁更改的字段的最佳方法是什么?根据{{3}} ...
然而,在内部,更新API只管理我们已经描述过的相同的retrieve-change-reindex流程。
特别是,考虑到索引字段的数量和某些必须分析的文本字段的大小,在索引文档时可能需要做些什么呢?
作为一个具体的例子,使用SO的观点并对问题和答案进行投票。重新索引文本正文只是为了更新这些值似乎很昂贵。
答案 0 :(得分:2)
也许你不应该这么频繁地更新。也许像投票/观看这样的事情应该只在ES中定期更新,而更多关键字段如答案/问题应立即推送。考虑什么是最重要的,看看你是否可以摆脱一定程度的陈旧性。
ElasticSearch非常适合文本搜索,但我不认为ES完全支持SO(或类似的应用程序)。它可以是一个有用的工具,用于搜索SO上的答案/问题,或内部应用程序(如日志/事件分析)。但也许用不同的解决方案可以更好地完成实际的数据服务?也许它应该由Cassandra提供动力而不是大部分工作?你明白了......
如果您想使用ES作为满足您需求的解决方案,并且您必须经常更新,您肯定可以考虑已经提到的父/子模型。当然,该方法将需要更多的内存/磁盘空间,当您查询总计时,它将占用更多的CPU /时间。另一种方法是让父存储可搜索的字段,并让子容器保存元数据(不分析子字段的字段)。这将允许您频繁更新而无需经历昂贵的重新索引,因为没有任何内容可以索引。
你也可以考虑我上面提到的内容,看看你是否可以逃脱一些陈旧性。这也可以通过多种方式完成。您可以按更改类型限制请求,或更改刷新/刷新间隔,或者如果要批量发送更新,请考虑重复删除更新。这些也有它们的缺点......
答案 1 :(得分:1)
我认为处理更改的最佳方法是拆分文档(您可以使用父子关系,或只是父ID),并使文档尽可能小(将可更改部分移动到新类型)。
这可以是满足您的要求的方式,比如SO,
您可以为此使用多种类型,请考虑此帖子(视图和投票计数)。
这是我认为最好的方式,也可能有其他意见。
由于
答案 2 :(得分:0)
我所做的是我使用像mongo或mysql这样的数据库来存储经常更新的属性,并使用弹性搜索来存储文档以进行文本搜索。
示例:我想保留有关图书及其内容的数据,并且我还希望保留视图的总数,每次用户查看文档时都会对文档进行更新和重新编制索引。