Elasticsearch的Java QueryBuilder

In Solace PubSub+ Cloud, we began storing metrics early on in anticipation for accounting and billing. The problem was that we weren’t quite sure which metrics would be used nor what sort of queries would be needed to support our accounting and billing needs.

我们选择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));

最终,我们意识到我们通常必须为查询添加组织的ID和一些时间范围,因此我们将其抽象出来,只需要提供查询中特定于指标的部分即可。

This worked at first, but we didn’t want to have to edit code every time we needed to calculate a new metric or slightly change an existing one. This is when we discovered Elasticsearch’s Wrapper Query.

从表面上看,这是简单的功能,您可以在其中向QueryBuilder对象提供JSON字符串。 像这样:

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

像这样将其输入到QueryBuilder中:

QueryBuilders.wrapperQuery(json);

下一个问题是如何开始扩展查询以跨组织ID和时间段进行搜索。 直觉的反应可能是在要替换的JSON字符串中的某处添加令牌,但这就是Elasticsearch API的用武之地。

您可能已经注意到Wrapper Query只是另一个QueryBuilder,这意味着您可以返回一个可以在其上添加更多参数的构建器。 这使我们可以重用大多数抽象处理,即向指标查询中添加组织ID和时间段:

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的查询,以简化测试和验证。

您如何看待该解决方案? 我们应该使用其他任何Elasticsearch API功能吗? 我们仍在学习并且喜欢听到有关新功能和用例的信息。


from: https://dev.to//solacedevs/elasticsearch-s-java-querybuilder-2kbb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值