[英]elasticsearch update fields for documents with matching _id
這是我的ES數據庫中典型文檔的外觀:
{
"_index": "test_index",
"_type": "data_pt",
"_id": "AWAEXNYdkjIRDAUZyu8d",
"_version": 1,
"_score": 1,
"_source": {
"state": "state_a",
...
}
}
在我的代碼中,我已經搜索了一個查詢,並為它們存儲了_id
列表:
query = {
...
{
'term': 'state_a'
},
...
}
results = es.search(index='test_index',_source=True,body=query)
hits = results['hits']['hits']
queried_id_list = [doc['_id'] for doc in hits]
我正在嘗試將具有匹配_id
的每個文檔的state
字段從'state_a'
為'state_b'
:
for _id in queried_id_list:
es.update(index='test_index',id='_id,doc_type='data_pt',
body=update_query)
但是,這會增加大量的開銷,因為它會為每個文檔調用update()
。
如果我嘗試直接放置queried_id_list
:
>>> es.update(index=test_index', id=queried_id_list, doc_type='data_pt', body=update_query)
Traceback (most recent call last):
...
File "/Users/username/anaconda/lib/python3.6/site-packages/elasticsearch/client/utils.py", line 76, in _wrapped
return func(*args, params=params, **kwargs)
File "/Users/username/anaconda/lib/python3.6/site-packages/elasticsearch/client/__init__.py", line 526, in update
raise ValueError("Empty value passed for a required argument.")
ValueError: Empty value passed for a required argument.
如何調用單個update()
完成此操作?
找到了解決方案。 為了其他在同一問題上苦苦掙扎的人的利益:
update_query = {
'script': {
'inline': 'ctx._source.state = "state_b"',
'lang': 'painless'
},
'query': {
'terms': {
'_id': queried_id_list
}
}
}
es.update_by_query(index='test_index', doc_type='data_pt', body=update_query)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.