добавить количество документов в списке внутри кода 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;
Другие вопросы по тегам