добавить количество do c в списке внутри python кода в поле в elasticsearch - PullRequest
2 голосов
/ 21 июня 2020

Мне нужно обновить поле do c в Elasticsearch и добавить счетчик do c в список внутри кода python. Поле weight содержит количество операций c в наборе данных. Набор данных необходимо время от времени обновлять, поэтому количество каждого документа также должно обновляться. 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
            }
        }
    }

например, допустим, do c с id = d1b145716ce1b04ea53d1ede9875e05a и weight = 5 уже присутствует в index. а также строка d1b145716ce1b04ea53d1ede9875e05a повторяется три раза в hashed_ids, поэтому запрос update_with_query, показанный выше, будет соответствовать do c в базе данных. Мне нужно добавить 3 к 5 и получить 8 в качестве окончательного weight

1 Ответ

2 голосов
/ 22 июня 2020

Я не знаю python, но вот решение на основе, например, нескольких предположений. Допустим, следующее hashed_ids извлечено:

hashed_ids = ["id1","id1","id1","id2"]

Чтобы использовать его в запросе терминов, мы можем получить только уникальный список идентификаторов, т.е.

hashed_ids_unique = ["id1", "id2"]

Предположим, что do c (s) проиндексированы со структурой ниже:

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 текущего совпадающего do c.

long weightToAdd = params.hashed_ids.stream().filter(idFromList -> ctx._source.id.equals(idFromList)).count();

Следующее добавляет weightToAdd к существующему значению weight в документе.

ctx._source.weight += weightToAdd;
...