2017-02-27 90 views
3

我在python中使用这段代码来更新elasticsearch中的文档。它工作正常,但很难将其用于数百万个文档,因为我必须每次初始化id值来更新每个文档。Elastisearch通过查询更新

from elasticsearch import Elasticsearch, exceptions 

elasticsearch = Elasticsearch() 

elasticsearch.update(index='testindex', doc_type='AAA', id='AVpwMmhnpIpyZkmdMQkT', 
       body={ 
        'doc':{'Device': 'updated'} 
       } 
       ) 

我的Elasticsearch文档中读取,这还没有包括在内,但: https://www.elastic.co/guide/en/elasticsearch/reference/current/_updating_documents.html

Note that as of this writing, updates can only be performed on a single document at a time. In the future, Elasticsearch might provide the ability to update multiple documents given a query condition (like an SQL UPDATE-WHERE statement).

+0

我很确定''update_by_query'获取作为q应该工作的参数。只需检查此python http://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.update_by_query – christinabo

+0

你好AhmyOhlin,欢迎来到该网站。我编辑了您的问题以匹配本网站上其他问题的格式,请随时再次编辑它。 – MackM

+0

@christinabo 我想将设备的值从'Boiler'更改为'Test'。 我使用参数q ='设备:“锅炉”'更新所有文档的值'锅炉',但我得到以下错误: TypeError:更新()有一个意想不到的关键字参数'q' 这是我的代码 'elasticsearch.update(index ='testindex',doc_type ='AAA',q ='Device:“Boiler”', body = {'doc':{'Device':'TESTs'} }' – AhmyOhlin

回答

3

使用update_by_query(不是update)和script,你应该能够更新文档匹配您的查询。

q = { 
    "script": { 
     "inline": "ctx._source.Device='Test'", 
     "lang": "painless" 
    }, 
    "query": { 
     "match": { 
      "Device": "Boiler" 
     } 
    } 
} 

es.update_by_query(body=q, doc_type='AAA', index='testindex') 

上面的工作适合我。 q查找与您的查询匹配的文档,脚本使用每个文档的_source更新值。

我希望它也适用于您,可能对您想要使用的查询进行一些调整。

+0

我试过你的代码,它工作正常。感谢您的帮助。 – AhmyOhlin

+0

有没有办法做到这一点作为upsert? – Iluvatar14