Каждый разработчик приложения рано или поздно сталкивается с таким важным вопросом, как выбор поискового движка. Можно сказать, что поисковый движок – это сердце API и главный элемент системы доступности контента, благодаря ему поиск и фильтрация происходят в разы быстрее, чем в реляционных базах данных.

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

Но на каком остановиться? В блогах разработчиков нет единого мнения. Мы рассмотрим два популярных, но принципиально разных поисковых движка – Sphinx и Elasticsearch – и объясним, почему сделали выбор в пользу первого при разработке приложения ЯRUS, и к чему это в итоге привело. Но сначала составим портрет каждого движка.

Sphinx – система полнотекстового поиска. Из плюсов – наличие лемматизаторов ru, en, du, большое количество стеммеров индексации и поиска: full-text, фасетный, geo. Нет ничего лишнего, лишь поисковый движок с быстрой индексацией и своим индексером. При правильной конфигурации RT индексов можно достичь real time indexing. В отличие от Elasticsearch наблюдаем умеренное использование памяти.

Что касается минусов, то главный из них – необходимость самому просчитывать всю структуру индексов, а значит, масштабирование проходит не так просто. Также у системы скудный API, нет возможности для визуализации, отсутствует fuzzy-поиск по дефолту (но можно реализовать свой) и скудное community.

Sphinx написан на C++. Им пользуются такие мастодонты, как Habr, Викимапия, Craigslist, поддерживается 1С-Битрикс.

Теперь несколько слов про Elasticsearch. Поисковая система проводит всю индексацию внутри себя, при этом управление индексами через RESTful API. Плюсы ElasticSearch – это фасетный поиск, легкое и мощное API, большое количество стеммеров, гибкая структура индексов и создание индексов постфактум. С техниками поиска тут тоже все хорошо: Full-text search, а также алгоритмы Geo и Fuzzy.

В Elasticsearch тоже много готовых реализованных модулей для ES, есть возможность хранить данные, Real Time индексация, достаточно легко масштабируется, ETL-механизмы, и что немаловажно – обширное community. Elasticsearch написан на Java и используется в Wikimedia, Mozilla, SoundCloud, GitHub и других площадках.

Что касается минусов Elasticsearch, то в их числе отсутствие своего индексера (необходимо реализовать свой или logstash в ELK), съедает много памяти, а лемматизаторы русского текста ставятся отдельно плагином.

Если бы нас попросили описать Sphinx и Elasticsearch одним выражением, то первую систему поиска мы бы охарактеризовали словами «быстрая индексация», а вторую – «мощный API».

При разработке приложения ЯRUS мы отдали предпочтение Sphinx. Требования к поиску были ниже, а поисковый движок подкупил прозрачной настройкой индексов в виде конфигурационных файлов и быстротой индексации. Но в последнее время мы задумываемся о смене Sphinx на Elasticsearch. Объясним, почему.

Сейчас запрос в API по поиску проходит в несколько этапов: сначала идет запрос в поисковый движок, после полученный результат поискового движка обогащается данными из баз данных. Нам бы хотелось перестать дергать БД (использовать лишь как холодное хранилище) и отдавать готовый модели напрямую из поискового движка. Elasticsearch (как мы уже писали ранее в плюсах) может в Data storage, поэтому ничего не мешает хранить нужные поля в Elastic.

Кроме того, объемы данных в приложении растут, а управление поиском на Sphinx через конфигурационные файлы усложняется (необходимо самому думать о шардах и репликах, на каждую ноду раскидывать свой конфиг), поэтому необходимо упростить управление поиском (отдать все управление данными и индексами сервису). Кроме того, для нас необходима Near Real Time индексация из коробки.

Что касается преимуществ, то мы отгородили разработчиков от сложного управления конфигурациями индексов like Sphinx, а также использовали облачное решение (MCS), из-за чего практически полностью забыли об администрировании. Надеемся, что наш опыт будет полезным для других разработчиков.

Комментарии (9)


  1. DrAndyHunter
    19.11.2021 11:15

    > Мы рассмотрим два популярных, но принципиально разных поисковых движка – Elasticsearch и Sphinx – и объясним, почему сделали выбор в пользу первого при разработке приложения

    и потом

    > При разработке приложения ЯRUS мы отдали предпочтение Sphinx

    Что?


    1. YARUSru Автор
      19.11.2021 11:24
      -1

      Да, проглядели несостыковку. Спасибо за замечание. Сейчас все на своих местах.


  1. M_AJ
    19.11.2021 11:48
    +1

    Им пользуются такие мастодонты, как Habr

    Так себе реклама если честно. Поиск Хабра одно время был внутренним мемом, и при каждом анонсе обновления в комментариях появлялись претензии, что лучше бы поиск нормальный сделали.


  1. GHostly_FOX
    19.11.2021 12:00
    +1

    Зачем это тут? Какова логика этого поста? Просто, что выбрали Эластик? Молодцы... а дальше то что?

    Где само сравнение?

    Где сравнение индексации данных и поиска по ним?


  1. Sovigod
    19.11.2021 14:13
    +3

    Я думал все живые пользователи sphinx уже перешли на manticoresearch Вы его не рассматривали?


    1. JetMaster
      21.11.2021 08:46

      а что с обычным sphinx не так?


      1. Sovigod
        21.11.2021 10:22

        Из того что с чем я сам бился и устал.

        • Однопоточная работа индексов. Можно как-то решать через Distributed, но real-time индексам это не помогает.

        • Баги фиксились годами. И это при наличии открытого кода и пулл реквестов на гитхабе.

        • Где там у исходный код теперь у сфинкса? Что с лицензией? Распространяется бинарными пакетами. Серьезно?

        • И последнее, но самое вкусное - репликация. real-time индексы без репликации и минимального HA - это кусочек нестабильности вашего сайта.


    1. NickyX3
      22.11.2021 09:59

      Плюсую, мы перешли, радуемся. Хотя по сути просто стащили конфиг сфинкса, чуток причесали и бахнули в мантикору.


    1. YARUSru Автор
      25.11.2021 10:52

      Не очень хотим возиться с конфигами при создании кластера, как это сделано в sphinx и manticore. Для elastic достаточно добавить новые ноды и подключить их к существующему кластеру. Если делать такое со sphinx/manticore, придется обновлять конфиги на всех нодах или изначально рассчитывать, сколько записей для шарда положить в одну ноду, где-то хранить эту схему шардирования и репликации. Плюс ни sphinx, ни manticore не предоставляются облачными решениями, чтобы отдать всю ответственность за железные ноды с готовым поисковым движком на сторону, освободив разработчиков от настройки кластера.