День добрый!
В продолжение темы про "НЕ идеальный" подсчет _score:
Я попробовал настроить более агрессивный merge в ES, но не особо получилось.
Из всех крутилов в:
https://github.com/elastic/elasticsearch/blob/7.10/server/src/main/java/org/elasticsearch/index/MergePolicyConfig.java
- Самой эффективной оказалась
index.merge.policy.segments_per_tier
. Как только в шарде больше сегментов - работает merge. Относительно её правитсяmax_merge_at_once
. Но, как то медленно ввод/вывод идет, как будьто еще IO scheduler для этих операций есть, который я не нашел. -
index.merge.policy.expunge_deletes_allowed
похоже рабратает только при вызове
``_forcemerge?only_expunge_deletes=true
-
index.merge.policy.deletes_pct_allowed
меньше 20% не задать, а 20% от нескольких ТБ много. -
index.merge.policy.reclaim_deletes_weight
вообще выпилили - Ради интереса ставил
"index.merge.policy.floor_segment": "1b"
, чтобы склеивались и самые маленькие шарды - не сработало
И самый главный фатальный недостаток - MergePolicy походе вызывается только из IndexWriter.
Т.е. если индекс постепенно остывает и становится только для чтения(поиска) нет шансов, что удаленные документы когда то удалятся на самом деле их число сравняется (или будет близким) и _score
будет считаться правильно. (индекс обновляется периодичеки, сильно, но редко).
Пока у меня только один вариант: периодически cron-ом вызывать _forcemerge
, если ElasticSearch сам этого не делает.
Поправте меня, если я ошибаюсь и есть нормальное решение.
P.S. идеальный _score
получается если количество помеченных на удаление документов совпадает во всех шардах и репликах. А посколько это процесс ассинхронный, то это число ноль!