Я знаю что раньше в версии 5.3 была функциональность rescore+collapse https://github.com/elastic/elasticsearch/pull/28521 и что ее выпилили, но в моей ситуации мне такая функциональность необходима. Основная идея - создать плагин который бы позволил эмулировать такое поведение
Я изучал исходные коды elastic'a и вот что получается:
QueryPhase имеет строгий порядок выполнения и rescore выполняется после всех collectors (в static boolean execute) и до выполнения второй фазы агрегации aggregationPhase.execute(searchContext);
все что мне нужно это в реализовоном мной классе унаследованом от InternalAggregations реализовать reduce метод в котором я и буду делать collapsing по id элемента с сортировкой по score
Мой вопрос - есть ли другие способы реализовать эту функциональность с помощью плагина (менять код эластика я не хочу, во всяком случае пока). Если нет то как можно вытащить score во время агригации (я так понял что можно через вложеную агрегацию с скриптингом, что выглядит не слишком хорошо)
насколько я понял, то проблема в том что из за скора на разных шардах могут не правльно разбиваться/определяться топ документы, в моем случае score должен выдавать LTR и проблем стандартных алгоритмов расчета вроде TF/IDF и bm25 не должно быть
Я не очень понимаю, что вы хотите сделать, но в контексте map_script агрегации scripted_metrics есть доступ к score. Так что может начать со script engine плагина и использовать эту агрегацию?
Я хочу после рескора, сделать коллапс. При этом рескор будет из плагина который получает веса из LTR'a.
Возможно, для решения задачи в плагине не нужны переопределять агрегаты, может быть есть более правильный/элегантный/производительный подход? Насколько решение с пропатченым elastic'ом и его queryPhase будет быстрее плагина с агрегатами? Естественно что это все нужно мерить, после разработки на близком к проду окружении, но, кажется, есть очевидные вещи для тех кто работает с эластиком каждый день.
Мои наблюдения, возможно не совсем верны, именно поэтому я прошу совета у тех кто может дать направление в котором можно (если можно) правильно решить задачу, так чтобы в продакшене это не ложилось при 1000 rps с response tim'ом в 200ms на кластере в 8 машин при кол-ве документов ~10млн.
P.S. Насколько я знаю любой доступ к скриптам сильно влияет на производительность, возможно это не так
Теперь понял. Я не думаю, что это можно сделать без значительной переработки elasticsearch, которую вы хотели-бы избежать. Надо смотреть глубже, но в данный момент у меня, к сожалению, нет для этого времени.
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.