Рубрики
Без рубрики

Elasticsearch Java QueryBuilder для построения запросов

В Solace PubSub + Cloud мы начали хранить метрики на ранней стадии в ожидании бухгалтерии и билли… С тегами solace, java, elasticsearch.

В Solace PubSub + Cloud мы начали хранить показатели на ранней стадии в ожидании учета и выставления счетов. Проблема заключалась в том, что мы не были вполне уверены, какие показатели будут использоваться и какие запросы потребуются для поддержки наших потребностей в бухгалтерском учете и выставлении счетов.

Мы выбрали Elasticsearch для хранилища, поскольку доверяли его мощным возможностям поиска и масштабируемости. Однако одним аспектом, который мы сильно недооценили, был его фантастический Java API. Хотя это, как правило, фасад для Elasticsearch REST API, особенно умная функция помогает нам создавать наш микросервис метрик с большой скоростью и гибкостью без ущерба для надежности.

Когда мы впервые начали использовать Elasticsearch, мы создавали запросы довольно простым способом:

BoolQueryBuilder()
 .must(QueryBuilders.termQuery("metricName", "Host"))
 .must(QueryBuilders.termQuery("metricType", "DiskSpace"))
 .must(QueryBuilders.termQuery("organizationId", organizationId))
 .must(QueryBuilders.rangeQuery("startTime").gte(startTime))
 .must(QueryBuilders.rangeQuery("endTime").lte(endTime));

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

Сначала это работало, но мы не хотели редактировать код каждый раз, когда нам нужно было вычислить новую метрику или немного изменить существующую. Именно тогда мы обнаружили Запрос-оболочку Elasticsearch .

На первый взгляд, это простая функциональность, с помощью которой вы можете передать объекту Query Builder строку JSON. Что-то вроде этого:

{
 "bool" : {
   "must" : [
     { "terms" : { "metricName" : ["Host"] } },
     { "terms" : { "metricType" : ["DiskSpace"] } }
   ]
 }
}

Который вы вводите в конструктор запросов следующим образом:

QueryBuilders.wrapperQuery(json);

Следующий вопрос заключается в том, как начать расширять запрос для поиска по идентификаторам организаций и периодам времени. Естественной реакцией было бы добавить токен где-нибудь в строку JSON, подлежащую замене, но именно здесь блестит API Elasticsearch.

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

BoolQueryBuilder()
 .must(QueryBuilders.wrapperQuery(json))
 .must(QueryBuilders.termQuery("organizationId", organizationId))
 .must(QueryBuilders.rangeQuery("startTime").gte(startTime))
 .must(QueryBuilders.rangeQuery("endTime").lte(endTime));

И с этим у нас было свое решение. Мы смогли легко создавать новые запросы Elasticsearch или обновлять существующие без каких-либо изменений кода, повторно используя наши хорошо протестированные абстракции для указания хорошо известных параметров поиска. Еще одним потрясающим преимуществом была возможность напрямую использовать наши файлы JSON в качестве запросов к Elasticsearch REST API для упрощения тестирования и проверки.

Что вы думаете об этом решении? Существуют ли какие-либо другие функции API Elasticsearch, которые мы должны были использовать вместо этого? Мы все еще учимся и любим слушать о новых функциях и вариантах использования.

Оригинал: “https://dev.to/solacedevs/elasticsearch-s-java-querybuilder-2kbb”