#elasticsearch #nest
#elasticsearch #гнездо
Вопрос:
Я использую прокрутку для поиска, и мне нужно очистить идентификаторы прокрутки после завершения поиска. Я использую Nest, и вызов api выглядит так, но я возвращаю эту ошибку.
{
"error": {
"root_cause": [
{
"type": "action_request_validation_exception",
"reason": "Validation Failed: 1: no scroll ids specified;"
}
],
"type": "action_request_validation_exception",
"reason": "Validation Failed: 1: no scroll ids specified;"
},
"status": 400
}
Однако я могу выполнить тот же вызов API с scroll_id в качестве параметра, и он работает нормально.
Я использую версию ES server 7.9 и предполагаю, что она удаляется, а scroll_id в теле запроса — это то, что должно быть правильным способом сделать это в соответствии с документацией.
Может ли кто-нибудь пролить свет на то, почему это не работает? Кроме того, есть ли способ выполнить удаление с помощью scroll_id в параметре с помощью Nest?
Заранее спасибо.
Комментарии:
1. Возможно ли, что Postman не отправляет тело запроса с
DELETE
запросом? Получаете ли вы ту же ошибку при вызове clear scroll API с клиентом? Есть ли у вас прокси перед Elasticsearch, который игнорирует тело запроса дляDELETE
запросов?2. да, я впервые заметил это в Fiddler во время запуска my. Сетевое приложение. И то, что выдает клиент NEST, — это то, что вы видите в моем тесте postman. Но на нашем ES-сервере есть прокси. Мне нужно будет это проверить.
3. оказывается, что прокси, который у нас есть перед ES, является виновником здесь. Спасибо, что указали на это.
Ответ №1:
Проблема, похоже, в том, что в вашем теле scroll_id
отправляется в виде массива строк, и вместо этого его следует отправлять в виде простой строки:
DELETE /_search/scroll
{
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
Комментарии:
1. я так не думаю. В их документации говорится, что это может быть строка или массив строк. Кроме того, Nest создает массив строк из scroll_id, который он получает в конструкторе класса.
2. Хммм, да, на самом деле это может быть как строка, так и список строк… Можете ли вы выполнить тот же запрос в curl, т. Е.
curl -v -XDELETE -H 'Content-Type: application/json' localhost:9200/_search/scroll -d '{"scroll_id": ["..."]}'
и обновить свой вопрос полученным результатом?3. Я не слишком знаком с curl, и моя аутентификация немного странная, так как я не уверен, как разобраться с этим из командной строки с помощью curl, учитывая мои небольшие знания об этом. Но postman, по-видимому, предоставляет версию curl для всех вызовов API, и вот как это выглядит. керл —расположение —HTTP-запрос delete ‘http:/XXXX:5050/_search/scroll контент-тип — заголовок’: приложение/JSON’ —данные-сырье ‘{ «scroll_id»: [«FGluY2x1ZGVfY29udGV4dF91dWlkDnF1zxj5vgkjhjkhhhhhhhhhhh»] }’
4. Хорошо, и что это даст, если вы запустите эту команду в терминале?
5. Здесь та же проблема, но через клиентскую библиотеку elastic от Nodejs с использованием
client.clearScroll()
… все еще не решено