TL; DR: представляем пакет golang для создания строк DSL JSON запроса elasticsearch: найди здесь!
Почему
Если вы использовали elasticsearch с golang, то вы, вероятно, использовали официальный клиент elasticsearch go.
Клиент es go исчерпывающий и в целом довольно хороший. Однако это может быть немного… страшно, когда приходится иметь дело с построением поисковых запросов с использованием запроса на эластичный поиск dsl.
Возьмем, к примеру, следующее (отсюда в документации):
Использование строк
По моему опыту, самый простой / быстрый способ создать эту строку json - это… ну, строка:
Если нам нужно ввести значения переменных, мы просто используем fmt.Sprintf
и продолжаем жить своей жизнью. Основная проблема здесь заключается в том, что проверка / форматирование этих строк json требует дополнительной работы и может быть подвержено ошибкам (например: жирная аппликатура где-то дополнительная запятая и т. Д.).
Использование структур (специфичных для конкретного случая)
Подход другой заключался бы в том, чтобы сделать все гиперспецифичным и создать структуры / настраиваемые маршалеры, которые будут генерировать формат запроса DSL json при вызове json.Marshal
(в указанной настраиваемой структуре (ах)).
Этот подход требует создания настраиваемых структур и кода с единственной целью создания этих запросов. (Это может сработать для определенных вариантов использования! Но это также означает больше кода и, следовательно, дополнительное обслуживание и больше проблем с переводом в другие проекты).
Что говорит гугл?
Лучшей документацией / поддержкой, которую я смог найти через google-fu, была эта статья, в которой также предлагалось создать строку json и скрестить пальцы (отрывок из сообщения в блоге выше):
Наконец, с 2019 года у клиента elasticsearch на ходу была эта проблема:
Этот пакет намеренно является клиентом нижнего уровня, а оливковый / эластичный - клиентом высокого уровня с расширениями для создания запросов и десериализации ответов. Мы стремимся предложить более высокоуровневый API в будущем, но, как я указывал в других заявках, не раньше, чем будет доступна машиночитаемая формальная спецификация тел запроса и ответа.
Более того (что удивительно, в этой ветке комментариев есть жемчужина в виде фрагмента кода):
Это очень похоже на то, что у меня получилось (если бы я не увидел это первым, хех), когда я решил эту проблему.
Независимо от того, что суть в следующем:
В настоящее время нет простого способа определить строки json-запроса DSL для использования с клиентом elasticsearch go.
И - возможно, по уважительной причине - официальный клиент, похоже, не будет поддерживать такую функцию в ближайшее время.
The What
По всем этим причинам я решил создать простую, менее зависимую (помимо go stdlib deps) утилиту, которая в общем определяет структуры для создания строк queryDSL json.
Вот пример (детская площадка)
Выход:
(Найдите больше примеров в тестах, включая исходный пример queryDSL, упомянутый в верхней части этого поста здесь)
Удачных вопросов, дружище
Опубликовано с помощью замечательного инструмента this.