gpt4 book ai didi

search - 将 "tag"应用于数百万个文档,使用批量/更新方法

转载 作者:行者123 更新时间:2023-11-29 02:48:20 25 4
gpt4 key购买 nike

我们的 ElasticSearch 实例中有大约 55.000.000 个文档。我们有一个带有 user_ids 的 CSV 文件,最大的 CSV 文件有 9M 个条目。我们的文档以 user_id 为键,这样很方便。

我发布这个问题是因为我想讨论并找到完成这个问题的最佳选择,因为有不同的方法可以解决这个问题。如果用户文档还没有,我们需要将新的“标签”添加到文档中,例如用“stackoverflow”或“github”标记用户。

  1. 有经典partial update端点。这听起来很慢,因为我们需要迭代超过 9M 的 user_id 并为每个 user_id 发出 api 调用。
  2. bulk request ,它提供了一些更好的性能,但一次调用中可以提及的 1000-5000 个文档有限。知道批处理何时过大有点知道我们需要如何在旅途中学习。
  3. 然后是official open issue对于具有大量流量的 /update_by_query 端点,但没有确认它已在标准版本中实现。
  4. 在这个 Unresolved 问题上提到了 update_by_query plugin这应该提供一些更好的处理,但是有一些老的和 Unresolved 问题,用户提示性能问题和内存问题。
  5. 我不确定它在 EL 上是否可行,但我想我会将所有 CSV 条目加载到一个单独的索引中,然后以某种方式连接两个索引并应用脚本,如果标签不存在则添加该标签。

所以问题仍然是什么是最好的方法,如果你们中的一些人过去这样做过,请确保你们分享你们的数字/表现,以及这次你们将如何做不同的事情。

最佳答案

在等待查询支持更新时,我选择了:

  1. 使用 scan/scroll API循环遍历要标记的文档 ID ( related answer )。

  2. 使用 bulk API执行 partial updates在每个匹配的文档上设置标签。

此外,我将标签数据(您的 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)

关于search - 将 "tag"应用于数百万个文档,使用批量/更新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26427819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com