我们的 ElasticSearch 实例中有大约 55,000,000 个文档。我们有一个带有 user_ids 的 CSV 文件,最大的 CSV 有 9M 个条目。我们的文档以 user_id 作为键,所以这很方便。
我发布这个问题是因为我想讨论并拥有完成此任务的最佳选择,因为解决此问题有不同的方法。如果用户文档还没有新的“标签”,我们需要将新的“标签”添加到文档中,例如用“stackoverflow”或“github”标记用户。
- 那里有经典partial update http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/partial-updates.html端点。这听起来很慢,因为我们需要迭代超过 9M 的 user_ids 并为每个用户发出 api 调用。
- 有bulk request http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html,它提供了一些更好的性能,但一次调用中可以提及的文档数量有限。知道批量何时太大就可以知道我们需要如何随时随地学习。
- 然后是官方开放问题 https://github.com/elasticsearch/elasticsearch/issues/2230 for
/update_by_query
端点有大量流量,但没有确认它已在标准版本中实现。
- 在这个开放问题上,提到了update_by_query 插件 https://github.com/yakaz/elasticsearch-action-updatebyquery/这应该提供一些更好的处理,但是存在用户抱怨性能问题和内存问题的老问题和未解决的问题。
- 我不确定它在 EL 上是否可行,但我想我会将所有 CSV 条目加载到一个单独的索引中,并以某种方式加入两个索引并应用脚本,该脚本将添加标签(如果尚不存在)。
因此,问题仍然是做到这一点的最佳方法是什么,如果你们中的一些人过去这样做过,请确保分享您的数字/表现以及这次您将如何采取不同的做法。
在等待查询支持更新时,我选择了:
Use the 扫描/滚动API http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/scan-scroll.html循环遍历您想要标记的文档 ID(相关答案 https://stackoverflow.com/questions/25496458/how-to-retrieve-all-the-document-ids-from-an-elasticsearch-index/25502275#25502275).
Use the bulk API http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html去表演部分更新 http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/partial-updates.html在每个匹配的文档上设置标签。
此外,我将标签数据(您的 CSV)存储在单独的文档类型中,并从中查询并在创建时标记所有新文档,即不必先索引然后更新。
用于说明该方法的 Python 片段:
def actiongen():
docs = helpers.scan(es, query=myquery, index=myindex, fields=['_id'])
for doc in docs:
yield {
'_op_type': 'update',
'_index': doc['_index'],
'_type': doc['_type'],
'_id': doc['_id'],
'doc': {'tags': tags},
}
helpers.bulk(es, actiongen(), index=args.index, stats_only=True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)