ES 大数据量按照日期分索引存储和查询

前言

  • ES 通常被用来存放各种日志数据或其他大批量数据,然后做统计。

  • 对于请求量大的系统来说,日志或其他业务数据无比庞大,需要按日期来划分索引,便于做冷热数据的迁移管理。大批量的业务数据也要根据日期来区分,提高检索效率。

  • 假设,日志数据按每日来分索引存储,索引名字格式:system_log_20240408,system_log_20240409 等来切分。查询时,使用别名system_log 或者 用多个索引联合查询。

DSL 语句验证

创建索引模板

创建索引模板,索引模板主要是用来创建索引默认属性mapping和其他设置settings,以及设置模板索引规则,方便后续增加每天对应的索引

PUT _template/system_log
{
  "order": 0,		// 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高
  "index_patterns": ["system_log_*"],	// 创建索引时,索引名称以这个为前缀时,默认使用此模板
  "settings": {
    "number_of_replicas": "1",	// 副本数量
    "number_of_shards": "1"	// 分片数量
  },
  "mappings":{
    "dynamic":"false",	//true 是默认值,自动添加新出现的字段到 mapping 中。false,不添加新出现的字段到 mapping 中,但可以在 doc 中保存新字段。"strict" 不允许出现新字段,会报错。其中嵌套结构内部支持单独配置。
    "properties": {		// 字段的映射
        "test_keyword_File": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                }
            }
        },
        "text": {
            "type": "text"
        },
        "keywordFile": {
            "type": "keyword"
        },
        "longFile": {
            "type": "long"
        },
        "date": {
            "type": "date",
            "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "booleanFile": {
            "type": "boolean"
        }
    }
  },
  "aliases": {
    "system_log": {}	// 创建索引时指定的别名,很重要
  }
}

查看模板

GET _template/system_log

在这里插入图片描述

修改模板

再次put一次,就可以完成自动修改

PUT _template/system_log
{
  "order": 0,		// 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高
  "index_patterns": ["system_log_*"],	// 创建索引时,索引名称以这个为前缀时,默认使用此模板
  "settings": {
    "number_of_replicas": "1",	// 副本数量
    "number_of_shards": "1"	// 分片数量
  },
  "mappings":{
    "dynamic":"false",	//true 是默认值,自动添加新出现的字段到 mapping 中。false,不添加新出现的字段到 mapping 中,但可以在 doc 中保存新字段。"strict" 不允许出现新字段,会报错。其中嵌套结构内部支持单独配置。
    "properties": {		// 字段的映射
        "test_keyword_File": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                }
            }
        },
        "text": {
            "type": "text"
        },
        "keywordFile": {
            "type": "keyword"
        },
        "longFile": {
            "type": "long"
        },
        "date": {
            "type": "date",
            "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "booleanFile": {
            "type": "boolean"
        }
    }
  },
  "aliases": {
    "system_log": {}	// 创建索引时指定的别名,很重要
  }
}

删除模板

DELETE _template/system_log	// 删除模板

插入数据会自动添加索引

这里我们指定的索引名称system_log_20240408,无此索引时会自动创建索引,创建索引时发现是以system_log_为前缀会默认使用上面的模板创建。所以索引system_log_20240408指向的别名是system_log

//增加system_log_20240408 索引,并增加一条数据
POST /system_log_20240408/_doc
{
   "test_keyword_File":"filename",
   "text":"text1",
   "keywordFile":"keywordFile",
   "date":"2024-04-08"
}

//增加system_log_20240408 索引,并增加一条数据
POST /system_log_20240409/_doc
{
   "test_keyword_File":"filename",
   "text":"text1",
   "keywordFile":"keywordFile",
   "date":"2024-04-09"
}

查看system_log_20240408 的别名

GET system_log_20240408/_alias

在这里插入图片描述

多索引数据检索

整体别名检索

GET system_log/_search

在这里插入图片描述

多个索引,用逗号隔开

GET system_log_20240408,system_log_20240409/_search

在这里插入图片描述

索引名模糊匹配

GET system_log*/_search

在这里插入图片描述

java 验证

 @Scheduled(cron = "0 0 0 * * *") // 每天0点创建新的索引
    public void test1(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String indexName = "system_log_" + sdf.format(new Date());

        //创建索引对象
        CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);

        //发送请求
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);

        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("索引操作:"+acknowledged);
        if (acknowledged) {
            System.out.println("Index " + indexName + " created successfully.");
        } else {
            System.out.println("Index " + indexName + " creation failed.");
        }


    }

插入数据和查询数据

详见这篇文章:
Elasticsearch-03-JavaApi以及springboot中操作-RestHighLevelClient

java代码多索引查询,用逗号分隔

public void test1(){
        //创建搜索对象
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("system_log_20240408","system_log_20240409");

        //构建查询的请求体
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //查询所有数据-查询全部
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        searchRequest.source(searchSourceBuilder);
        //发送请求
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //分析结果
        SearchHits hits = search.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }


    }
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于ESElasticsearch)来说,大数据查询速度慢可能有多种原因。以下是一些常见的解决方案和优化建议: 1. 确保适当的硬件资源:ES对于处理大数据查询需要足够的硬件资源支持,包括内存、CPU和存储。确保您的硬件配置足够满足您的查询需求。 2. 片和副本设置:ES通过将数据成多个片并复制到多个节点来实现水平扩展和高可用性。合理设置片和副本的数,可以提高查询性能。 3. 索引设计优化:索引的设计对于查询性能至关重要。确保索引的字段类型正确,并使用合适的词器和析器。避免使用过多的字段或者不必要的字段。 4. 查询优化:尽避免使用全文搜索查询,可以使用过滤器、聚合等更高效的查询方式。使用查询缓存来缓存频繁使用的查询结果。 5. 数据压缩和压缩算法选择:对于大数据的场景,可以考虑使用压缩算法来减少磁盘空间占用和网络传输开销。 6. 确保网络连接稳定:ES是一个布式系统,网络连接的稳定性对于查询性能至关重要。确保网络连接畅通,并且减少网络延迟。 7. 升级ES版本:ES的版本更新通常会包含性能改进和优化,因此考虑升级到最新版本。 这些只是一些常见的解决方案和优化建议,具体的优化策略还需要根据您的具体环境和需求进行定制。希望对您有所帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值