一尘不染

使用批量/更新方法将“标签”应用于数百万个文档

elasticsearch

我们的ElasticSearch实例中约有55.000.000的文档。我们有一个带user_ids的CSV文件,最大的CSV有900万个条目。我们的文档以user_id为键,因此很方便。

我发布这个问题是因为我想讨论并拥有解决此问题的最佳选择,因为有多种方法可以解决此问题。如果用户文档还没有新的“标签”,则需要在文档中添加新的“标签”,例如,使用“
stackoverflow”或“ github”标记用户。

  1. 有经典的局部update端点。这听起来很慢,因为我们需要遍历9M个user_id,并为每个ID发出api调用。
  2. bulkrequest,它提供了一些更好的性能,但是一次调用中只能提及1000-5000个文档。知道批处理量太大的时间就等于我们需要在旅途中学习。
  3. 再有就是官方开放问题/update_by_query端点其中有大量的流量,但没有确认它在标准发布实施。
  4. 在这个未解决的问题上,提到了update_by_query插件,该插件应提供更好的处理,但是在旧的和未解决的问题中,用户抱怨性能问题和内存问题。
  5. 我不确定它是否可以在EL上使用,但我想我会将所有CSV条目加载到一个单独的索引中,并以某种方式将这两个索引连接起来,并应用脚本来添加标记(如果尚不存在)。

因此,问题仍然是执行此操作的最佳方法是什么,如果你们中的某些人过去曾这样做,请确保分享您的数字/表现以及这次您将如何做不同的事情。


阅读 219

收藏
2020-06-22

共1个答案

一尘不染

使用上述的按查询更新插件,您只需调用:

curl -XPOST localhost:9200/index/type/_update_by_query -d '{
    "query": {"filtered": {"filter":{
        "not": {"term": {"tag": "github"}}
    }}},
    "script": "ctx._source.label = \"github\""
}'

按查询更新插件仅接受脚本,不接受部分文档。

至于性能和内存问题,我想最好的办法就是尝试一下。

2020-06-22