добавить количество документов в списке внутри кода Python в поле в elasticsearch
Мне нужно обновить поле документа в Elasticsearch и добавить количество этого документа в список внутри кода Python. Вweight
Поле содержит количество документов в наборе данных. Набор данных необходимо время от времени обновлять, поэтому количество каждого документа также должно обновляться.hashed_ids
- это список идентификаторов документов, содержащихся в новом пакете данных. вweight
совпадения идентификатора должно быть увеличено на количество идентификаторов в 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
а также weight
=5 уже присутствует в index. а также строкаd1b145716ce1b04ea53d1ede9875e05a
повторяется трижды в hashed_ids
Итак update_with_query
запрос, показанный выше, будет соответствовать документу в базе данных. Мне нужно добавить 3 к 5 и получить 8 в качестве окончательногоweight
1 ответ
Я не знаю о python, но вот решение на основе, например, с несколькими предположениями. Скажем, следующееhashed_ids
извлечено:
hashed_ids = ["id1","id1","id1","id2"]
Чтобы использовать его в запросе терминов, мы можем получить только уникальный список идентификаторов, т.е.
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
текущего соответствующего документа.
long weightToAdd = params.hashed_ids.stream().filter(idFromList -> ctx._source.id.equals(idFromList)).count();
Следующее добавляет weightToAdd
к существующей стоимости weight
в документе.
ctx._source.weight += weightToAdd;