elasticsearch,pyes,Groovy,elasticsearch,Pyes" /> elasticsearch,pyes,Groovy,elasticsearch,Pyes" />

Groovy 如何使用Elasticsearch脚本尽可能快地部分更新5亿个文档

Groovy 如何使用Elasticsearch脚本尽可能快地部分更新5亿个文档,groovy,elasticsearch,pyes,Groovy,elasticsearch,Pyes,我维护了一个包含大约5亿个文档的索引。其中,每个文档都有一个字符串字段,包含1到10个单词。我想分析每个文档中这个字段的字数,并将结果存储到相应文档的“字数”字段中 我知道这里有部分更新功能: 我想知道是否可以使用脚本化的部分更新(可能使用高级Groovy脚本)来显著提高上述任务的速度。如果是这样的话,有人能给出一个如何开始的提示吗 目前,我正在使用下面的python脚本,但速度非常慢(在大数据方面,由于网络往返次数和负载大小很多) 我只找到了一个关于为运行在ElasticSearch中的Gr

我维护了一个包含大约5亿个文档的索引。其中,每个文档都有一个字符串字段,包含1到10个单词。我想分析每个文档中这个字段的字数,并将结果存储到相应文档的“字数”字段中

我知道这里有部分更新功能:

我想知道是否可以使用脚本化的部分更新(可能使用高级Groovy脚本)来显著提高上述任务的速度。如果是这样的话,有人能给出一个如何开始的提示吗

目前,我正在使用下面的python脚本,但速度非常慢(在大数据方面,由于网络往返次数和负载大小很多)

我只找到了一个关于为运行在ElasticSearch中的Groovy脚本提供的上下文的示例

基于此,下面是设置/更新两个字段的Groovy等价物:

ctx._source.keywordLength = ctx._source.keyword.split(' ').size()
ctx._source.timestampUpdated = new Date().format('yyyy-MM-dd')
我无法理解搜索和迭代是如何发挥作用的


也可能会有所帮助。

当我有大量数据需要批量更新数百万个文档并且无法负担往返费用时,我通常会使用。原理非常简单,它允许您使用查询DSL运行查询,并在所有匹配的文档上运行脚本来执行任何您喜欢的操作

在您的情况下,它将是这样的:

curl -XPOST localhost:9200/corpus/update_by_query -d '{
    "query": {
        "match_all": {}
    }, 
    "script": "ctx._source.keywordLength = ctx._source.keyword.split(\" \").size() + 1; ctx._source.timestampUpdated = new Date().format(\"yyyy-MM-dd\");"
}'
还请注意,为了能够运行此功能,您需要在
elasticsearch.yml
文件中启用脚本:

# before ES 1.6
script.disable_dynamic: false

# since ES 1.6
script.inline: on

如果网络延迟是瓶颈,我怀疑Groovy解决方案会更快。Python有一些并发解决方案:Groovy有GPAR:您认为并发处理记录对您有用吗?使用Groovy指的是运行在elasticsearch中的elasticsearch脚本引擎。这样做的好处是,文档不需要来回移动到python或任何其他脚本。这就是我所说的“更少的往返和更少的有效载荷”。同时运行python是可能的,但我需要提供额外的逻辑来为每个脚本实例/线程提供不同的块,而无需创建争用条件。需要将“按查询更新”更正为“按查询更新”,并删除“附近的拆分(\“\”)
update\u by\u query
现已包含在elasticsearch 2.3及更高版本中。
# before ES 1.6
script.disable_dynamic: false

# since ES 1.6
script.inline: on