在使用 Elasticsearch 的时候,我们可能会遇到需要以范围为条件查询索引数据的需求。有两种方法可以实现我们的需求:
接下来,我们就以时间范围为例,详述这两种查询索引数据的方法。
在 Elasticsearch 中,想要通过命令实现范围查询,需要使用range
关键字,命令示例为:
curl -X GET "localhost:9200/monitor_indices_name-*/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range" : {
"time" : {
"gte" : "2019-04-05T02:37:48",
"lt" : "2019-04-05T07:57:48"
}
}
}
}
'
*
表示模糊匹配;gt
,greater than
的缩写,表示>
大于lt
,less than
的缩写,表示<
小于gte
,greater than or equal to
的缩写,表示>=
大于或等于lte
,less than or equal to
的缩写,表示<=
小于或等于total
表示查询结果的总数在这里,我们以 Java API 为例,进行演示。代码示例为:
public class ElasticsearchRangeQuery {
public void esRangeQuery(String masterNodeIp, int port) {
// 集群客户端配置
Settings settings = Settings.builder().put("client.transport.sniff", false)
.put("cluster.name", "testRangeQuery")
.put("client.transport.ping_timeout", 60, TimeUnit.SECONDS)
.build();
TransportClient client = new PreBuiltTransportClient(settings);
try {
// 添加传输端口号和地址
TransportAddress transportAddress = new TransportAddress(new InetSocketAddress(masterNodeIp, port));
client.addTransportAddress(transportAddress);
// 初始化索引和类型
String index = "monitor_indices_name-*";
String type = "monitor";
// 多条件查询
SearchResponse searchResponse = client.prepareSearch(index).setTypes(type)
.setQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchPhraseQuery("testField", "testFieldValue"))
.must(QueryBuilders.rangeQuery("time").from("2019-04-05T02:37:48")
.to("2019-04-05T07:57:48")))
.setExplain(true)
.setSize(50)
.execute()
.actionGet();
SearchHits searchHits = searchResponse.getHits();
if (searchHits.getTotalHits() > 0) {
SearchHit[] hits = searchHits.getHits();
// 循环打印结果数据
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
} catch (Throwable e) {
e.getStackTrace();
}
}
}
如上述代码所示,其中testRangeQuery
为 Elasticsearch 集群的名称。
rangeQuery
,为范围查询。matchPhraseQuery
,为文本查询;特别地,无论是通过命令查询,还是通过 API 查询,默认都是展示前 10 条记录,我们可以通过设置size
来调整查询结果的数量。
"size": 50
语句即可;setSize(50)
方法即可。如上述所示,调整命中结果返回前 50 条记录。
最后,还有一点需要我们特别注意,那就是 Elasticsearch 索引中存储的时间格式。如果两者不一致,我们需要在查询前进行转换!
好了,本篇文章到这里就要结束了,希望能够对大家有所帮助。