Года полтора назад столкнулся с проблемой выбора клиента к ElasticSearch для node.js. Тогда нашлось несколько проектов, но все были либо слишком усложненные, либо написаны абы как. Хотя казалось: все что нужно — это обертка вокруг http запроса с JSON.encode/decode, обработкой ошибок и парой хэлперов. Тогда для ноды я быстро написал небольшой модуль, который оказался очень удобным.
Недавно надо было прикрутить ES к приложению на рельсах. Часть клиентов для Ruby уже давно не поддерживается, другие слишком усложнены. При этом многие клиенты не имеют механизма управления алиасами, хотя для ES это очень важный функционал.
Я решил написать минималистичный гем, взяв за основу модуль для node.js и расширив его функционал так, чтобы были все самые необходимые инструменты для разработки, деплоя и управления. Вот что получилось.
Минималистичное API
У ES хорошая документация и некоторые методы имеют много настроек. В elastics нет хэлпера для всех возможных методов. Основной метод — Client#request
, позволяющий выполнить любой запрос. Есть хэлперы для http-методов и некоторых простых запросов. С таким подходом никогда не будет ситуации, что elastics не поддерживает функции новых/старых версий.
DSL для запросов тоже нет. По-моему, он только мешает и затягивает разработку (чтение документации, исходников, необходимость переводить примеры запросов из документации ES к новому DSL).
Интеграция с ActiveRecord
С возможностью выбора index-per-application/index-per-model и CRUD методами. Поддержку других ORM добавить не составит труда.
Управление индексами и маппингами без простоя
Elastics хранит настройки алиасов в ES, никаких сторонних хранилищ не требуется. Для конфликтующей миграции можно создать новый индекс, запустить приложение, работающее с ним, загрузить в него данные, а потом обновить алиасы (для этого есть таска). Разные индексы никак не связаны между собой: если нужно обновить алиасы только для одного, остальные можно не переиндексировать.
Rake и Capistrano таски
для миграций и индексирования моделей.
AutoRefresh режим для тестирования
В этом режиме после каждого запроса, изменяющего состояние, выполняется refresh-запрос на том же индексе.
Elastics работает с рельсами и без них. Код, примеры и более подробное описание можно посмотреть на github.
Автор: printercu