Elasticsearch在计算后将两个字段回填到一个新字段中

时间:2016-12-13 17:32:32

标签: python elasticsearch groovy

问题。我的任务是研究如何在Elasticsearch中回填数据。到目前为止有点空洞。基本要点是:

注意:所有文档都存储在每日索引下,每天约有20万个文档。

  • 我需要能够重新索引大约60天的数据。
  • 我需要为每个doc payload.time_sec和payload.time_nanosec取两个字段,取值并对它们进行一些数学运算(time_sec * 10 ** 9 + time_nanosec)然后将其作为单个字段返回到重新索引文件

我正在查看带有批量助手的Python API文档: http://elasticsearch-py.readthedocs.io/en/master/helpers.html

但我想知道这是否可能。

我的想法是使用: 批量助手用于提取滚动ID(批量_update?),遍历每个文档ID,从每个停靠点的两个字段中提取数据,进行数学运算,并使用新的字段数据完成更新请求。

有人这样做过吗?也许是一个时髦的剧本?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

批量帮助程序用于提取滚动ID(批量_update?),遍历每个文档ID,从每个停靠点的两个字段中提取数据,进行数学运算,并使用新的字段数据完成更新请求。 / p>

基本上,是的:

  • 使用/_search?scroll获取文档
  • 执行您的操作
  • 发送/_bulk更新请求

其他选项包括:

两者都支持脚本,如果我理解正确的话,它将是完美的选择,因为您的更新不依赖于外部因素,所以这也可以直接在服务器内完成。

答案 1 :(得分:0)

这是我(大致)的地方:

我一直在使用Python和批量帮助器,到目前为止在这里:

doc = helpers.scan(es, query={
"query": {
"match_all": {}

},
"size":1000 
},index=INDEX, scroll='5m', raise_on_error=False)


    for x in doc:
x['_index'] = NEW_INDEX
try:
    time_sec = x['_source']['payload']['time_sec']
    time_nanosec=x['_source']['payload']['time_nanosec']
    duration = (time_sec * 10**9) + time_nanosec
except KeyError: pass

count = count + 1

x['_source']['payload']['duration'] = duration
new_index_data.append(x) 

helpers.bulk(es,new_index_data)

从这里开始我只是使用批量python帮助器插入新索引。但是,我将尝试使用批量更新对现有索引进行更改和测试。

这看起来像是一种正确的方法吗?