600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 详述 Elasticsearch 通过范围条件查询索引数据的方法

详述 Elasticsearch 通过范围条件查询索引数据的方法

时间:2023-07-26 19:07:09

相关推荐

详述 Elasticsearch 通过范围条件查询索引数据的方法

文章目录

情景查询方法通过命令实现范围查询通过 API 实现范围查询

情景

在使用 Elasticsearch 的时候,我们可能会遇到需要以范围为条件查询索引数据的需求。有两种方法可以实现我们的需求:

第一种:在服务器或者终端,使用命令来查询索引数据;第二种:编写程序,通过 Elasticsearch 的 API 来查询索引数据。

接下来,我们就以时间范围为例,详述这两种查询索引数据的方法。

查询方法

通过命令实现范围查询

在 Elasticsearch 中,想要通过命令实现范围查询,需要使用range关键字,命令示例为:

curl -X GET "localhost:9200/monitor_indices_name-*/_search?pretty" -H 'Content-Type: application/json' -d'{"query": {"range" : {"time" : {"gte" : "-04-05T02:37:48","lt" : "-04-05T07:57:48"}}}}'

标注 1:主节点 IP;标注 2:索引名称,其中*表示模糊匹配;标注 3:待查范围字段,根据查询的需求进行替换;标注 4:范围条件,有四种比较符号,分别为gtgreater than的缩写,表示>大于ltless than的缩写,表示<小于gtegreater than or equal to的缩写,表示>=大于或等于lteless than or equal to的缩写,表示<=小于或等于标注 5:查询结果,total表示查询结果的总数

通过 API 实现范围查询

在这里,我们以 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("-04-05T02:37:48").to("-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语句即可;API 查询,直接调用setSize(50)方法即可。

如上述所示,调整命中结果返回前 50 条记录。

最后,还有一点需要我们特别注意,那就是 Elasticsearch 索引中存储的时间格式。如果两者不一致,我们需要在查询前进行转换!

好了,本篇文章到这里就要结束了,希望能够对大家有所帮助。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。