簡體   English   中英

定期處理和更新 elasticsearch 索引中的文檔

[英]Periodically process and update documents in elasticsearch index

我需要想出一個策略來定期有效地處理和更新 elasticsearch 索引中的文檔。 我不必查看我之前處理過的文件。

我的設置是我有一個長時間運行的過程,它不斷地將文檔插入索引,比如大約。 每小時 500 個文檔(想想常見的日志記錄示例)。

我需要找到一種解決方案來定期更新一些文檔(例如通過 cron 作業)以在特定字段(例如文本字段)上運行一些代碼,以使用許多新字段來增強該文檔。 我想這樣做是為了在索引上提供更細粒度的聚合。 在日志類比中,這可能是,例如,我從日志條目(文檔)中獲取 UserAgent 字符串,對其進行一些解析,然后將一些新字段添加回該文檔並為其編制索引。

所以我的方法是:

  1. 獲取一些我以前沒有看過的文件(甚至全部)。 例如,我可以通過組合must_notexists來查詢它們。
  2. 在這些文檔上運行我的代碼(運行解析器,計算一些新的東西,等等)。
  3. 更新之前獲得的文檔(可能最好通過批量 api)。

我知道有查詢 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 ) )

注釋:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM