当前位置: 首页 > 面试题库 >

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

徐鑫鹏
2023-03-14
问题内容

我们的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条目加载到一个单独的索引中,并以某种方式将这两个索引连接起来,并应用脚本来添加标记(如果尚不存在)。

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我对脚本使用批量更新以更新嵌套字段,但这非常慢: 您知道另一种可能更快的方法吗? 为了不对每次更新重复执行脚本,似乎可以存储该脚本,但是我找不到保持“动态”参数的方法。 问题答案: 与性能优化问题一样,由于有许多可能导致性能不佳的原因,因此没有唯一的答案。 在您的情况下,您正在批量请求。当执行,该文件实际上是被重新索引: …要更新文档就是要对其进行检索,更改,然后为整个文档重新编制索引

  • 我有如下elasticsearch文档,其中我需要根据creationtime currentdate更正年龄值 年龄=创建时间-当前日期 : 我想根据每个文档ID进行批量更新,但问题是我需要更正6个月的数据 有没有一种方法可以做到这一点,而不是循环遍历,我遇到的所有使用Pandas数据帧进行更新的示例都是基于已知值的。但是在这里_id我将在代码运行时得到。 我写的逻辑是获取所有文档 谁能给我一些

  • 问题内容: 我想用Django更新表格-原始SQL中的内容如下: 我的第一个结果是这样的-但这很讨厌,不是吗? 有没有更优雅的方式? 问题答案: UPD Django 2.2版本现在具有bulk_update。 请参阅以下django文档部分 一次更新多个对象 简而言之,你应该可以使用: 你还可以使用F对象来执行诸如增加行数之类的操作: 请参阅文档:https : //docs.djangopro

  • 问题内容: 有什么方法可以简化为一个查询吗? 问题答案: 是的,您可以使用以下查询进行操作:

  • 我有一个目标表(已经填充了数据)和另一个(源表),我需要将数据检索到第一个。 目标_表格 source_table 我需要使用 tusers 表中的 id 更新 ttasks 表id_user列,因此 ttasks 的最终结果应该是: 我尝试过的(类似于INSERT… from…语句): 但是这个查询总是使用我的q1子查询中的第一个id。 关于我如何完成这项任务,有什么想法、帮助甚至解决方案吗?非

  • 问题内容: 此代码示例属于Stopwatch类的一部分,该类属于一个较大的项目的一部分,该更大的项目的目的是成为模仿Android Clock的桌面gui应用。我具有秒,分钟,小时等标签,这些标签应该从计时器任务内部的无限while循环中更新,而该计时器任务在布尔状态为true时运行。while循环应该实时更新GUI标签。我让计时器任务每毫秒执行一次。为什么我的GUI在程序更新第一个Label后立