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.