将 python 代码中列表中的文档计数添加到 elasticsearch 中的字段

add the count of doc in list inside python code to a field in elasticsearch

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

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=d1b145716ce1b04ea53d1ede9875e05aweight=5 的文档已经存在于索引中。并且字符串 d1b145716ce1b04ea53d1ede9875e05ahashed_ids 中重复了三次,因此上面显示的 update_with_query 查询将匹配数据库中的文档。我需要将 3 加到 5,最后得到 8 weight

我不知道 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"]
    }
  }
}

脚本说明:

下面给出了当前匹配文档idhashed_ids列表中匹配id的个数

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

下面将 weightToAdd 添加到文档中 weight 的现有值。

ctx._source.weight += weightToAdd;