[英]Periodically process and update documents in elasticsearch index
我需要想出一個策略來定期有效地處理和更新 elasticsearch 索引中的文檔。 我不必查看我之前處理過的文件。
我的設置是我有一個長時間運行的過程,它不斷地將文檔插入索引,比如大約。 每小時 500 個文檔(想想常見的日志記錄示例)。
我需要找到一種解決方案來定期更新一些文檔(例如通過 cron 作業)以在特定字段(例如文本字段)上運行一些代碼,以使用許多新字段來增強該文檔。 我想這樣做是為了在索引上提供更細粒度的聚合。 在日志類比中,這可能是,例如,我從日志條目(文檔)中獲取 UserAgent 字符串,對其進行一些解析,然后將一些新字段添加回該文檔並為其編制索引。
所以我的方法是:
must_not
和exists
來查詢它們。我知道有查詢 API 的更新。 但這似乎不在這里,因為我需要在我的服務器上運行我自己的代碼(順便說一句取決於外部庫),而不是作為一個無痛的腳本,它不會提供我需要的全面任務。
我正在通過python 訪問 elasticsearch 。
現在的問題是我不知道如何實現上述方法。 例如,如果在步驟 1 中獲得的文檔量大於myindex.settings.index.max_result_window
怎么辦?
有任何想法嗎?
我考慮了@Jay 的評論並最終得出了這種模式:
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
from elasticsearch.helpers import scan
from my_module.postprocessing import post_process_doc
es = Elasticsearch(...)
es.ping()
def update_docs( docs ):
""""""
for idx,doc in enumerate(docs):
if idx % 10000 == 0:
print( 'next 10k' )
new_field_value = post_process_doc( doc )
doc_update = {
"_index": doc["_index"],
"_id" : doc["_id"],
"_op_type" : "update",
"doc" : { <<the new field>> : new_field_value }
}
yield doc_update
docs = scan( es, query='{ "query" : { "bool": { "must_not": { "exists": { "field": <<the new field>> }} } }}', index=index, scroll="1m", preserve_order=True )
bulk( es, update_docs( docs ) )
注釋:
preserve_over=True
,否則會引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.