【问题标题】:add the count of doc in list inside python code to a field in elasticsearch将python代码中列表中的doc计数添加到elasticsearch中的字段
【发布时间】:2020-06-22 11:17:58
【问题描述】:

我需要更新 Elasticsearch 中文档的字段,并将该文档的计数添加到 python 代码内的列表中。 weight 字段包含数据集中文档的计数。数据集需要不时更新。因此每个文档的计数也必须更新。 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

【问题讨论】:

  • 你能详细解释一下你想做什么吗?
  • @gaurav9620 我用更多解释更新了问题
  • 您想更新文档中的字段并将计数添加到python代码中的数据结构中。不是吗?如果是这样,您可以添加一个示例吗?
  • @Gibbs 我补充了一些解释
  • 所以,hashed_ids 是一个array 类型,如果它与它自己的id 匹配,那么您需要更新同一文档的weight。所以这三个都与相同的文档字段相关。我理解正确吗?

标签: python elasticsearch elasticsearch-query update-by-query


【解决方案1】:

我不知道 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多