Обновление документа ElasticSearch=true, похоже, не работает

#elasticsearch #amazon-elasticsearch

Вопрос:

Чтобы ускорить поиск на нашем веб-сайте, я создал небольшой экземпляр эластичного поиска, в котором хранятся копии всех «доступных для поиска» полей из нашей базы данных. Он содержит всего пару миллионов документов со средним размером около 1 КБ на документ. В настоящее время (в разработке) у нас всего 2 узла, но, вероятно, потребуется больше в производстве.

Наше приложение является приложением «в первую очередь для чтения» — возможно, обновляется 1000 документов в день, но их читают и ищут 10 тысяч раз в день.

Каждый документ представляет собой обращение в системе продажи билетов, и обращение может менять статус в течение дня по мере того, как пользователи изучают и закрывают обращения. Если исследователь закрывает дело, а затем немедленно обновляет свою очередь открытых работ, мы ожидаем, что дело исчезнет из их очереди, которая управляется запросом к нашему экземпляру эластичного поиска, фильтруемому по статусу. Статус-это поле в индексе обращения.

Жалоба, которую мы получаем, заключается в том, что, когда исследователь закрывает дело после немедленного обновления своей очереди, дело все равно возвращается при фильтрации по «незавершенным» делам. Если он обновит изображение секундой или двумя позже, оно исчезнет.

Пытаясь обойти это, я добавил refresh=true при обновлении документа, например, curl-XPUT ‘https://my-dev-es-instance.com/cases/_doc/11?refresh=true‘ -d ‘{«статус»:»закрыто», … }’

Но все равно проблема сохраняется.

Вот ответ, который я получил от вышеупомянутого запроса:

{«_index»:»cases»,»_type»:»_doc»,»_id»:»11″,»_version»:2,»result»:»updated»,«forced_refresh»:true,«_shards»:{«total»:2,»successful»:1,»failed»:0},»_seq_no»:70757,»_primary_term»:1}

Ответ, по-видимому, подтверждает, что запрос forced_refresh был получен, хотя в нем говорится, что из 2 осколков 1 был успешным, а 0-неудачным. Не уверен насчет другого, но поскольку у меня всего 2 узла, означает ли это, что он обновил вторичный?

В соответствии с документом doc: Для обновления фрагмента (а не всего индекса) сразу после выполнения операции, чтобы документ немедленно появился в результатах поиска, параметр refresh может быть установлен в значение true. Установка этого параметра в значение true должна быть выполнена ТОЛЬКО после тщательного обдумывания и проверки того, что это не приведет к низкой производительности как с точки зрения индексирования, так и с точки зрения поиска. Обратите внимание, что получение документа с помощью API get происходит полностью в реальном времени и не требует обновления.

Разумны ли мои ожидания? Есть ли лучший способ сделать это?

Комментарии:

1. Вы пытались очистить кэш ? с cases/_cache/clear?query=true помощью которого можно было бы предотвратить возврат ответа кэша при повторном поиске

2. @ExploZe это звучит намного дороже, чем обновление одного осколка, не так ли? Поскольку весь смысл моего экземпляра elastic заключается в ускорении поиска, я боюсь, что это может оказать гораздо более негативное влияние на время поиска.

Ответ №1:

После дополнительного тестирования я пришел к выводу, что моя проблема была вызвана логической ошибкой приложения, а не проблемой с ElasticSearch. Флаг обновления ведет себя так, как ожидалось. Приношу извинения за дезинформацию.