前言
-
ES 通常被用来存放各种日志数据或其他大批量数据,然后做统计。
-
对于请求量大的系统来说,日志或其他业务数据无比庞大,需要按日期来划分索引,便于做冷热数据的迁移管理。大批量的业务数据也要根据日期来区分,提高检索效率。
-
假设,日志数据按每日来分索引存储,索引名字格式:system_log_20240408,system_log_20240409 等来切分。查询时,使用别名system_log 或者 用多个索引联合查询。
创建索引模板
创建索引模板,索引模板主要是用来创建索引默认属性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": {} // 创建索引时指定的别名,很重要}
}
DSL 语句验证
查看模板
GET _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());}}