#python #python-3.x #elasticsearch #elasticsearch-5
#python #python-3.x #elasticsearch #elasticsearch-5
Вопрос:
как обновить поле в эластичном поиске с помощью bulkupdate в python. я перепробовал много способов, чтобы все они выдавали ошибку. В некоторых случаях я получаю ошибку отсутствия документа, как мне обновить и обновить одновременно. а также добавление в поле не работает.elasticsearch == 7.9.1 — это пакет, который я использовал в python
for i in range(0, length, steps):
end_index = length-1 if i steps>length else i steps
temp_list = test_data[i: end_index]
bulk_file = ''
actions = [{
"_index": "test-data",
"_opt_type":"update",
"_type": "test-test-data",
"_id": test_row ['testId'],
"doc":{"script": {
"source": "ctx._source.DataIds.add(params.DataIds)",
"lang": "painless",
"params": {
"DataIds":test_row ['DataIds']
}
}}
}
for test_row in temp_list
]
helpers.bulk(es, actions)
Ошибка, которую я получаю, заключается в следующем
{'update': {'_index': 'test-data', '_type': 'products', '_id': '333', 'status': 400, 'error': {'type': 'illegal_argument_exception', 'reason': 'failed
to execute script', 'caused_by': {'type': 'script_exception', 'reason': 'runtime error', 'script_stack': ['ctx._source.dataIds.add(params.dataIds)', '
^---- HERE'], 'script': 'if (ctx._source.dataIds == null) { ctx._source.dataIds = []; } ctx._source.dataIds.add(params.dataIds)', 'lang': 'painless', 'position': {'offse
t': 105, 'start': 71, 'end': 118}, 'caused_by': {'type': 'illegal_argument_exception', 'reason': 'dynamic method [java.lang.String, add/1] not found'}}}, 'data': {'upsert': {}, 'scripted_up
sert': True, 'script': {'source': 'if (ctx._source.dataIds == null) { ctx._source.dataIds = []; } ctx._source.dataIds.add(params.dataIds)', 'lang': 'painless', 'params': {'c
dataIds': 'set123'}}}}}])
Комментарии:
1. @Lupanoide когда я меняю поле на doc, поля в эластичном поиске добавляются следующим образом: «doc.script.lang безболезненно». я не могу обновить поле DataIds
2. @Lupanoide Массовое обновление невозможно с помощью скрипта. я не понимаю, что не так с кодом. все поля внутри «doc» добавляются как поле в эластичном поиске, например: «doc.script.lang:»безболезненно»
3. Не уверен, что это ваша проблема, но «_opt_type» должно быть «_op_type»
4. @ekmcd не работает
Ответ №1:
Правильный способ с upsert
помощью скрипта — без doc
раздела, а только script
раздел. Вам также понадобится upsert
раздел, если вы хотите выполнить обновление и обновление в одной команде. Это выглядит так:
actions = [{
"_op_type":"update",
"_index": "test-data",
"_type": "test-test-data",
"_id": test_row ['testId'],
"upsert": {
"DataIds": test_row ['DataIds']
},
"script": {
"source": "ctx._source.DataIds.add(params.DataIds)",
"lang": "painless",
"params": {
"DataIds":test_row ['DataIds']
}
}
} for test_row in temp_list
]
Другой способ сделать это с scripted_upsert
actions = [{
"_op_type":"update",
"_index": "test-data",
"_type": "test-test-data",
"_id": test_row ['testId'],
"upsert": {},
"scripted_upsert": true,
"script": {
"source": "if (ctx._source.DataIds == null) { ctx._source.DataIds = []; } ctx._source.DataIds.add(params.DataIds)",
"lang": "painless",
"params": {
"DataIds":test_row ['DataIds']
}
}
} for test_row in temp_list
]
Комментарии:
1. я получаю эту ошибку ‘error’: {‘type’: ‘illegal_argument_exception’, ‘reason’: ‘не удалось выполнить скрипт’, ’caused_by’: {‘type’: ‘script_exception’, ‘reason’: ‘ошибка времени выполнения’,@Val
2. Это уже лучше 🙂 Можете ли вы обновить свой вопрос с полной ошибкой, которую вы получаете?
3. Ошибка означает, что в каком-то документе
dataIds
есть строка, а не массив. Возможно ли это?dynamic method [java.lang.String, add/1] not found
4. да, это было потому, что dataIds где string, это исправлено, и когда я попробовал с помощью scripted_upsert. В идентификаторы данных добавляются нулевые значения. может быть, потому, что безболезненный скрипт
5. Я думаю, вам следует создать еще один вопрос, потому что этот вопрос решен сейчас, и это еще одна проблема.