首页 > 解决方案 > 将python代码内列表中的doc计数添加到elasticsearch中的字段

问题描述

我需要更新 Elasticsearch 中文档的字段,并将该文档的计数添加到 python 代码内的列表中。该weight字段包含数据集中文档的计数。数据集需要不时更新。因此每个文档的计数也必须更新。hashed_ids是新一批数据中的文档 ID 列表。匹配的weightid 必须增加 中该 id 的计数hashed_ids。我尝试了下面的代码,但它不起作用。

hashed_ids = [hashlib.md5(doc.encode('utf-8')).hexdigest() for doc in shingles]
update_with_query_body = {
        "script": {
            "source": "ctx._source.content_completion.weight +=param.count",
            "lang": "painless",
            "param": {
                "count": hashed_ids.count("ctx.['_id']")
            }
        },
        "query": {
            "ids": {
                "values": hashed_ids
            }
        }
    }

例如,假设索引中已经存在带有id=d1b145716ce1b04ea53d1ede9875e05a和=5 的文档。weight并且字符串d1b145716ce1b04ea53d1ede9875e05a在中重复了三遍,hashed_ids因此update_with_query上面显示的查询将匹配数据库中的文档。我需要将 3 添加到 5 并有 8 作为最终weight

标签: pythonelasticsearchelasticsearch-queryupdate-by-query

解决方案


我不知道python,但这是一个基于例如的解决方案,有一些假设。假设以下是hashed_ids提取的:

hashed_ids = ["id1","id1","id1","id2"]

要在术语查询中使用它,我们可以获得唯一的 id 列表,即

hashed_ids_unique = ["id1", "id2"]

让我们假设文档使用以下结构进行索引:

PUT test/_doc/1
{
  "id": "id1",
  "weight":9
}

现在我们可以通过查询使用更新,如下所示:

POST test/_update_by_query
{
  "query":{
    "terms": {
      "id":["id1","id2"]
    }
  },
  "script":{
    "source":"long weightToAdd = params.hashed_ids.stream().filter(idFromList -> ctx._source.id.equals(idFromList)).count(); ctx._source.weight += weightToAdd;",
    "params":{
      "hashed_ids":["id1","id1","id1","id2"]
    }
  }
}

脚本说明:

下面给出了当前匹配文档hashed_ids列表中匹配 id 的计数。id

long weightToAdd = params.hashed_ids.stream().filter(idFromList -> ctx._source.id.equals(idFromList)).count();

以下将与文档中weightToAdd的现有值相加。weight

ctx._source.weight += weightToAdd;

推荐阅读