Обновление большого количества документов по отдельности с помощью Python DSL Elasticsearch UpdateByQuery - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь использовать UpdateByQuery для обновления свойства большого количества документов.Но так как каждый документ будет иметь разное значение, мне нужно выполнить ir один за другим.Я перебираю большое количество документов, и для каждого документа я называю эту функцию:

def update_references(self, query, script_source):

    try:
        ubq = UpdateByQuery(using=self.client, index=self.index).update_from_dict(query).script(source=script_source)
        ubq.execute()

    except Exception as err:
        return False

    return True

Вот некоторые примеры значений:

  • query = {'query': {'match': {'_id': 'VpKI1msBNuDimFsyxxm4'}}}
  • script_source = 'ctx._source.refs = [\' python \ ', \' java \ ']'

Проблема в том, что, когда я это делаю, я получаю сообщение об ошибке: «Слишком много динамических компиляций скриптов в пределах, макс .: [75 / 5m]; пожалуйста, используйте вместо этого индексированные или скрипты с параметрами; это ограничение может быть изменено[script.max_compilations_rate] setting ".

Если я изменю max_compilations_rate с помощью Kibana, это не даст никакого эффекта:

PUT _cluster/settings
{
  "transient": {
    "script.max_compilations_rate": "1500/1m"
  }
}

В любом случае, было бы лучше использовать параметризованный скрипт.Я попытался:

def update_references (self, query, script_source, script_params):

    try:
        ubq = UpdateByQuery(using=self.client, index=self.index).update_from_dict(query).script(source=script_source, params=script_params)
        ubq.execute()

    except Exception as err:
        return False

    return True

Итак, на этот раз:

  • script_source = 'ctx._source.refs = params.value '
  • script_params = {' value ': [\' python \ ', \' java \ ']}

Но так как мне нужно обновитьзапрос и параметры каждый раз, мне нужно создать новый экземпляр UpdateByQuery для каждого документа в большой коллекции, и в результате та же ошибка.

Я также попытался просмотреть и обновить большую коллекцию с:

es.update(
    index=kwargs["index"],
    doc_type="paper",
    id=paper["_id"],
    body={"doc": {
        "refs": paper["refs"]  # e.g. [\\'python\\', \\'java\\']
    }}
)

Но я получаю следующую ошибку: «Не удалось установить новое соединение: [Errno 99] Невозможно назначить запрошенный адрес juil. 10 18:07:14 bib gunicorn [20891]: POSThttp://localhost:9200/papers/paper/OZKI1msBNuDimFsy0SM9/_update [status: N / A request: 0.005s "

Так что, пожалуйста, если у вас есть идея, как решить эту проблему, она будет очень признательна.Лучшее,

...