python - 将python代码内列表中的doc计数添加到elasticsearch中的字段
问题描述
我需要更新 Elasticsearch 中文档的字段,并将该文档的计数添加到 python 代码内的列表中。该weight
字段包含数据集中文档的计数。数据集需要不时更新。因此每个文档的计数也必须更新。hashed_ids
是新一批数据中的文档 ID 列表。匹配的weight
id 必须增加 中该 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
解决方案
我不知道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;
推荐阅读
- php - 在 PHP 类的静态变量中传递函数
- mysql - 无法在 MacOS 上运行 MySQL
- java - Kafka java消费者使用太多内存
- java - 如何在 Android 中使用 TabLayout 和 ViewPager2
- python - 在 Python 2.7 中同时处理多个 POST 请求
- python - 如何在情节中更改注释方向?
- javascript - Javascript:以参数作为参数传递函数并获取此参数
- java - 将图像插入现有的非空 pdf
- cordova - Cordova 可以在 iOS“文件”应用程序中读/写文件吗?
- php - 错误警告:join():PHP 中传递的参数无效