solovyov.net

Є така штука - еластіксьорч. В мене з ним якісь love/hate 💔 відносини. Він вміє дуже прикольні штуки, але і має дві вади.

1️⃣ Він завжди, у кожному місці, хоч крапельку, але недороблений. 2️⃣ Його доки завжди написані для тих, хто вже шарить. Тобто якщо ти читаєш якусь доку вперше, то зрозуміти, що вона тобі розповідає, майже неможливо.

І мені спало на думку, що це через неортогональність різних фіч еластіка між собою. Вони не складаються у пазл. Вони кожна окрема сама собі, тому якщо її в одному місці приробили, то в іншому вона працювати не буде. І тому доки такі нерозбірливі, бо якщо ти з однією фічею розібрався — це не означає, що ти зрозумієш інші.

Почну з контр-прикладу: в постгресі додали можливість вибирати частину JSON’у з поля. І одразу ти можеш це використовувати у селекті, у where, у сортуванні, у агрегаціях, можеш будь-яку строку привести до JSON’у і так само воно буде працювати всюди. Це ортогональність фіч: розробникам постгресу не прийшлось окремо всюди припилювати це механізм, в них нормальні абстракції. 🎉

Натомість давайте подивимость на Elasticsearch. Скажімо, в нас є така штука, як вішлісти. Ти можеш лайкати товари і ми тобі за це потім скажемо, коли на нього впаде ціна. Але є люди, в яких цих товарів дуже багато (десятки і сотні тисяч товарів налайкали, це капець), тож ми їм хочемо дати можливість ті товари фільтрувати. Складати в кожен товар перелік користувачів, у яких він в вішлісті, трішечки нерозумно — популярні товари таки дуже популярні (в найпопулярнішого - 8,5 тисяч лайків 🤯).

Але ми беремо фільтр terms, який дозволяє сказати “хочу лише оці документи”. Якби в нас були сотні товарів в одного користувача, то ми б просто їх параметрами запиту передали. Але в нас тисячі (десятки навіть)! Еластік такий: не бійся, чувак, я все шарю. 👌 Диви на доку нижче , якщо ти замість списку термів передаш спеціальну мапу, то це буде означати “хочу документи, список яких є он в тому документі”. Ну типу вішліст твій будемо складати в еластік одним документом і потім на нього посилатися (ну теж не дуже ефективно звучить, але ж кращє ніж на читанні таке селектити з бази).

Наче норм, так? Проблему вирішили? Ось тільки ми ж хочемо їх видати так, щоб найсвіжіші (за часом додавання користувачем) були вгорі. А еластік видає як йому заманеться. Добре б його попрохати відсортувати, як у тому нашому документі з вішлістом. Але ж немає шансів! Тому що фільтр термс те вміє, а сортування не вміє. Той “джойн” — не ортогональна фіча. 💩

І це втомлює реально. Еластіксьорч то набор юзкейсів, якщо твого не зробили — то й працювати не буде. Хз, шо з тими вішлістами робити. 🤷

(@ tg)