前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详述 Elasticsearch 通过范围条件查询索引数据的方法

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

作者头像
CG国斌
发布2022-05-06 10:09:40
1.9K0
发布2022-05-06 10:09:40
举报
文章被收录于专栏:维C果糖

文章目录

情景

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

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

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

查询方法

通过命令实现范围查询

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

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

通过 API 实现范围查询

在这里,我们以 Java API 为例,进行演示。代码示例为:

代码语言:javascript
复制
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语句即可;
  • API 查询,直接调用setSize(50)方法即可。

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 情景
  • 查询方法
    • 通过命令实现范围查询
      • 通过 API 实现范围查询
      相关产品与服务
      Elasticsearch Service
      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档