API УДАЛЕНИЯ / _search / scroll не работает с идентификатором прокрутки в теле

#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() … все еще не решено