在使用 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" : "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 为例,进行演示。代码示例为:

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 索引中存储的时间格式。如果两者不一致,我们需要在查询前进行转换!

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

在使用 Elasticsearch 的时候,我们可能会遇到需要**以范围为条件查询索引数据**的需求。有两种方法可以实现我们的需求:- 第一种:在服务器或者终端,使用命令来查询索引数据;- 第二种:编写程序,通过 Elasticsearch 的 API 来查询索引数据。接下来,我们就以**时间范围**为例,详述这两种查询索引数据的方法。
需求:根据时间范围查询es中的数据 说明:在使用logstash将关系型数据库中的数据抽到es中时,需要转为时间搓格式保存,这样就可以根据时间搓进行时间范围查询了 注意:如果不对时间字段做处理,默认的保存格式不方便进行时间范围查询 默认保存到es中的时间格式: 这种格式不方便我们的客户端进行时间范围查询 logstash抽取mysql中的数据时,对于datetime类型的字段,可以使用unix...
IDEA 全称 IntelliJ IDEA,是java编程语言的集成开发环境。 (1)community(社区版):免费的IntelliJ IDEA community版本是基于开源代码构建的,可以用于纯JVM 和 Android 开发,拥有大部分开发中所需要的功能,但是不能够提供前端css和js的技术支持。 (2)ultimate(最终版):付费的 IntelliJ IDEA ultimate版本可以支持web端和企业端的开发使用,能支持众多前端和后端框架和技术,可以提供分析和数据库工具、HTTP客户端,
索引结构 1、索引的最小存储单位是innodb定义的数据页 2、对于单个数据页,数据是按顺序存储的,并且数据页头记录了当前页数据的最大和最小值,维护最大和最小值是为了更方便的够成b+树,数据顺序存储,且内存是连续分配的,在查找的时候可二分查找 3、数据页记录FIL_PAGE_PREV和FIL_PAGE_NEXT,b+数叶子节点构成双向链表,在无法使用索引时,可已很方便的进行全表扫描。 聚簇索引 聚簇索引,叶子节点存储的是实际的数据,一般聚簇索引行程的b+树在三层以内,三层满了,数据量117
索引实验 实验目的:了解索引对于全列匹配,最左前缀匹配、范围查询的影响。实验所用数据库见文章最底部连接。 实验软件版本:5.7.19-0ubuntu0.16.04.1-log (Ubuntu) 实验存储引擎:InnoDB show index from `employees`.`titles` 实验一、全列匹配 explain select * from `employees`.`tit...
import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Iterator; import java.util.Map.Entry; import org.elasticsearch.action.ListenableActionFuture; im... 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否)。 说明:任何字段如果为非负数,必须是 unsigned。 注意:POJO 类中的任何布尔类型的变量,都不要加 i...