将 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
=d1b145716ce1b04ea53d1ede9875e05a
和 weight
=5 的文档已经存在于索引中。并且字符串 d1b145716ce1b04ea53d1ede9875e05a
在 hashed_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"]
}
}
}
脚本说明:
下面给出了当前匹配文档id
的hashed_ids
列表中匹配id的个数
long weightToAdd = params.hashed_ids.stream().filter(idFromList -> ctx._source.id.equals(idFromList)).count();
下面将 weightToAdd
添加到文档中 weight
的现有值。
ctx._source.weight += weightToAdd;
我需要在 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
=d1b145716ce1b04ea53d1ede9875e05a
和 weight
=5 的文档已经存在于索引中。并且字符串 d1b145716ce1b04ea53d1ede9875e05a
在 hashed_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"]
}
}
}
脚本说明:
下面给出了当前匹配文档id
的hashed_ids
列表中匹配id的个数
long weightToAdd = params.hashed_ids.stream().filter(idFromList -> ctx._source.id.equals(idFromList)).count();
下面将 weightToAdd
添加到文档中 weight
的现有值。
ctx._source.weight += weightToAdd;