Давным-давно, была проблема: выполняя один и тот же запрос мы получали разный список документов. Оказалось из-за близости _score два документна меняли местами в зависимости от того на какой шард уйдет запрос.
Тогда я изменил search_type на dfs-query-then-fetch и всё, насколько я помню, полечилось - _score считался в глобальном смысле и был всегда одинаков.
А на днях оказалось, что это уже не работает. Запрос - элементарный, но каждый раз выдается то один _score, то другой.
Похоже что, словарь терминов на репликах отличается от праймари по какой-то причине. Попробуйте сбросить количество реплик до 0 и потом увеличить до нужного количества.
Дык судя по описанию dfs... и должен устанять эту проблему, раз учитываеются все термы на всех шардах. Сумма то не меняется. У меня такое впечатление, что search_type просто игнорируется, но как в этом убидиться пока не придумал.
А как это полечить разово понятно, _forcemerge?max_num_segments=1 тоже помогает.
Но это разовая акция, а проблема повторяется на нескольких кластерах, следовательно постоянно.
DFS идет по всем шардам, то есть выбирает одну шарду с каждым номером (либо праймари, либо одну из реплик). Поэтому если реплика рассинхронизировались, то score будет прыгать. Можно провести такой эксперимент - запустить запрос несколько раз без DFS, посмотреть какие score будут генерироваться, записать все разные варианты. Потом повторить с DFS и посмотреть - те же цифры получаются или нет.
Цыфры разные. Два варианта с DFS и два по дефолту. Получается вообще нет гараинтии, что ответ будет тот же, соответвенно очередность документов, даже в неизмененном индексе? BUG? Что с этим делать, т.к. у меня такая ситуация на всех кластерах оказывается. Документы часто обновляюься, но это вроде базовые хотелки, чтобы ответ был повторяем.
GET help3/_stats?level=shards&filter_path=indices.*.shards.*.docs
то что оно вам выдает?
Кстати, другое временное решение - это добавить текст запроса в параметр preference. Тогда elasticsearch не будет прыгать по шардам для данного запроса.
Я ожидал более большой разницы в deleted, но она есть и может вносить изменения в score, так как idf включает в себя удаленные документы. И количество удаленных документов зависит от того, как происходит merge, который происходит независимо на всех шардах, за исключением случая, когда вы делаете force_merge и убираете все документы.
Можно и hash. От этого значения будет все равно hash рассчитан и на основе этого hash-а будут выбран набор шард, который не будет менятся. То есть он должен быть постоянен для запроса и различен между запросами - для равномерного распределения запросов. Можно так же использовать user id или session id.
Этот индекс в принципе маленький и его редко обновлют. В начале разница была больше, может документов добавили или оно всё же очень медленно синкается.
Звучит так, что это фундаментальный баг. Все знают о проблеме, но её не решить просто так. Issues то есть, но закрыты с отпиской "юзайте preference - чинить не будем". Почему-то все думали, что в неизмененном индексе _score должен быть не изменен.
Получается и в dfs-query-then-fetch особого смысла нет, раз он не гарантирует незменность результата в индексе где удаляются документы.
Я думаю, при таком подходе, возможно, нам бы хватило простого _search?scroll, но для этого надо сильно переделывать логику работы приложения.
А PIT надо еще тестировать на производительность - всегда найдется тот кто сделает 837 snapshot-а и будет жалосться на производительнолсть ФС.
Я думаю в любом проекте удаляются документы, иначе это очень специфичное использование. Типа, поставил на документе флаг удален, при поиске его используешь и удалешь индекс целиком, когда все документы помечены как удаленные ну или как то так, какая то фантастическая утопия.
Еще я не нахожу "крутилку", как заставить более агрессивно работать automerge. Ладно бы они были и постепенно уходили, а так если нагрузки нет удаленные документы так и будут висеть не обработанными.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.