elasticsearch相关java API(详细版)
文章目录
一、业务工具类
elasticsearch查询数据的操作基本上都差不多,主要不同的是查询条件的组合。
1. 获取es连接(工具类)
public static RestHighLevelClient getEsHighInit() {RestClientBuilder http = RestClient.builder(new HttpHost("192.168.248.10", 9200, "http")).setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {@Overridepublic RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {requestConfigBuilder.setConnectTimeout(700000);requestConfigBuilder.setSocketTimeout(600000);requestConfigBuilder.setConnectionRequestTimeout(100000);return requestConfigBuilder;}});return new RestHighLevelClient(http);}
2. 获取所有索引(工具类)
public static List<Map<String, Object>> getIndex(RestHighLevelClient esHighInit) throws IOException {List<Map<String, Object>> resultList = new ArrayList();GetAliasesRequest request = new GetAliasesRequest();GetAliasesResponse alias = esHighInit.indices().getAlias(request, RequestOptions.DEFAULT);Map<String, Set<AliasMetaData>> map = alias.getAliases();map.forEach((k, v) -> {if (!k.startsWith(".")) {//忽略elasticesearch 默认的Map map1 = new HashMap();map1.put("indexName", k);resultList.add(map1);}});return resultList;}
3. 获取数据(工具类)
public static Map<String, Object> getData(RestHighLevelClient restHighLevelClient, String index, SearchSourceBuilder searchSourceBuilder) throws IOException {Map<String, Object> result = new HashMap<>();List<Map<String, Object>> datas = new ArrayList<>();//1.创建 SearchRequest搜索请求SearchRequest searchRequest = new SearchRequest();//2.设置需要查看的索引if (!StringUtils.isEmpty(index)) {searchRequest.indices(index);//指定要查询的索引}//3.将 SearchSourceBuilder 添加到 SearchRequest中searchRequest.source(searchSourceBuilder);//4.执行查询SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//5.解析查询结果SearchHits hits = searchResponse.getHits();for (SearchHit hit : hits) {Map map = new HashMap();map.put("index", hit.getIndex());//索引map.put("source", hit.getSourceAsString());//内容map.put("id", hit.getId());//内容datas.add(map);}result.put("data", datas);result.put("total", hits.getTotalHits().value);return result;}
4. 聚合查询数量(工具类)
public static List<Map<String, Object>> getGroupCount(RestHighLevelClient client, String index, SearchSourceBuilder sourceBuilder) throws IOException {List<Map<String, Object>> result = new ArrayList<>();//1.创建 SearchRequest搜索请求SearchRequest searchRequest = new SearchRequest();//2.设置需要查看的索引if (!StringUtils.isEmpty(index)) {searchRequest.indices(index);//指定要查询的索引}//3.将 SearchSourceBuilder 添加到 SearchRequest中searchRequest.source(sourceBuilder);//4.执行查询SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms terms = searchResponse.getAggregations().get("logCount");//5.解析查询结果List<? extends Terms.Bucket> groupBuckets = terms.getBuckets();for (Terms.Bucket bucket : groupBuckets) {Map<String, Object> data = new HashMap<>();String key = bucket.getKeyAsString(); // 分组的key值long count = bucket.getDocCount(); // 分组的日志数量data.put("key", key);data.put("count", count);result.add(data);}return result;}
5. 各种业务场景构造条件查询数据与统计
public static void main(String[] args) throws IOException {//=======================获取es连接=======================RestHighLevelClient esHighInit = getEsHighInit();//=======================查询所有索引=======================
// List<Map<String, Object>> indexs = getIndex(esHighInit);//=======================查询某个索引底下的所有数据=======================//创建 SearchSourceBuilder条件构造
// SearchSourceBuilder searchSourceBuilder1 = new SearchSourceBuilder();
// //查找所有
// MatchAllQueryBuilder matchAllQueryBuilder1 = QueryBuilders.matchAllQuery();
// searchSourceBuilder1.query(matchAllQueryBuilder1);
// List<String> messages1=matchAll(esHighInit, "index_test",searchSourceBuilder1);//=======================查询某个索引底下的所有数据(根据条件)=======================
// //创建 SearchSourceBuilder条件构造
// SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// //设置分页
// searchSourceBuilder.from(0);
// searchSourceBuilder.size(10);
// //设置数据顺序
// searchSourceBuilder.sort("count", SortOrder.ASC);
// //指定需要返回或者排除的字段
// String[] includes = {"count","address","age","name"};
// String[] excludes = {};
// searchSourceBuilder.fetchSource(includes, excludes);
// //查找所有
// //MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// //searchSourceBuilder.query(matchAllQueryBuilder);
// //分词关键字查找
// MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "天宫");
// matchQueryBuilder.operator(Operator.OR);
// searchSourceBuilder.query(matchQueryBuilder);
//
// List<String> messages=matchAll(esHighInit, "index_test",searchSourceBuilder);//=======================查询某个索引底下的所有数据(精确查询Term)=======================
// //创建 SearchSourceBuilder条件构造
// SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
// //Term查找,一般针对数字等,因为中文或者字母有些灰分分词,找不到,除非设置"index" : "not_analyzed"
// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("count", 2);
// searchSourceBuilder2.query(termQueryBuilder);
// List<String> messages2=matchAll(esHighInit, "index_test",searchSourceBuilder2);//=======================查询某个索引底下的所有数据=======================//创建 SearchSourceBuilder条件构造
// SearchSourceBuilder searchSourceBuilder1 = new SearchSourceBuilder();
// //查找所有
// MatchAllQueryBuilder matchAllQueryBuilder1 = QueryBuilders.matchAllQuery();
// searchSourceBuilder1.query(matchAllQueryBuilder1);
// List<String> messages1=matchAll(esHighInit, "index_test",searchSourceBuilder1);//=======================查询某个索引底下的所有数据(日期查询range)=======================
// //创建 SearchSourceBuilder条件构造。
// SearchSourceBuilder searchSourceBuilder3 = new SearchSourceBuilder();
// //范围查询
// RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("count"); //date字段
// rangeQueryBuilder.lt(2);
// searchSourceBuilder3.query(rangeQueryBuilder);
// List<String> messages3 = matchAll(esHighInit, "index_test", searchSourceBuilder3);//=======================查询某个索引底下的所有数据(多个id查询)=======================
// //创建 SearchSourceBuilder条件构造。
// SearchSourceBuilder searchSourceBuilder4 = new SearchSourceBuilder();
// //多个id 查找
// IdsQueryBuilder idsQueryBuilder4 = QueryBuilders.idsQuery();
// idsQueryBuilder4.addIds("15", "2", "3");
// searchSourceBuilder4.query(idsQueryBuilder4);
// List<String> messages3 = matchAll(esHighInit, "index_test", searchSourceBuilder4);//=======================查询某个索引底下的所有数据(复合查询)=======================
// //创建 SearchSourceBuilder条件构造。
// SearchSourceBuilder searchSourceBuilder5 = new SearchSourceBuilder();
// //Bool查找
// BoolQueryBuilder boolQueryBuilder5 = QueryBuilders.boolQuery();
// // and
// //boolQueryBuilder5.must(QueryBuilders.rangeQuery("count").gte(2));
// //boolQueryBuilder5.must(QueryBuilders.matchQuery("address", "天"));
// // or
// boolQueryBuilder5.should(QueryBuilders.rangeQuery("count").gte(2));
// boolQueryBuilder5.should(QueryBuilders.matchQuery("address", "天"));
// searchSourceBuilder5.query(boolQueryBuilder5);
// List<String> messages3 = matchAll(esHighInit, "index_test", searchSourceBuilder5);//=======================查询某个索引底下的所有数据(复合查询)=======================
// //创建 SearchSourceBuilder条件构造。
// SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// //Fuzzy 查找
// FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("address", "天").fuzziness(Fuzziness.ONE);
// searchSourceBuilder.query(fuzzyQueryBuilder);
// List<String> messages3 = matchAll(esHighInit, "index_test", searchSourceBuilder);//=======================查询所有数据=======================
// //创建 SearchSourceBuilder条件构造
// SearchSourceBuilder searchSourceBuilder1 = new SearchSourceBuilder();
// //设置分页,默认十条
// searchSourceBuilder1.from(0);
// searchSourceBuilder1.size(10);
// //查找所有
// MatchAllQueryBuilder matchAllQueryBuilder1 = QueryBuilders.matchAllQuery();
// searchSourceBuilder1.query(matchAllQueryBuilder1);
// Map<String, Object> result = matchAll(esHighInit, "", searchSourceBuilder1);//*查询真实日志文件数据(查询业务1)*
// //创建 SearchSourceBuilder条件构造
// SearchSourceBuilder searchSourceBuilder1 = new SearchSourceBuilder();
// //设置分页,默认十条
// searchSourceBuilder1.from(0);
// searchSourceBuilder1.size(10);
// //filter过滤查询
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// boolQueryBuilder.must(QueryBuilders.rangeQuery("@timestamp").gte("2023-03-14 09:37:00").lte("2023-03-18 09:40:00").format("yyyy-MM-dd HH:mm:ss").timeZone("+08:00"));
// boolQueryBuilder.must(QueryBuilders.matchQuery("agent.hostname", "localhost.localdomain"));
// boolQueryBuilder.must(QueryBuilders.matchQuery("log.file.path", "/home/es/jar-log/txt.log"));
// boolQueryBuilder.must(QueryBuilders.matchQuery("message", "error"));
// boolQueryBuilder.must(QueryBuilders.matchQuery("fields.filetype.keyword", "jar-log"));
// searchSourceBuilder1.postFilter(boolQueryBuilder);
// Map<String, Object> result = getData(esHighInit, "", searchSourceBuilder1);//*查询真实日志文件数据(查询聚合数据2)*
// SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("logCount").field("fields.filetype.keyword");
// sourceBuilder.aggregation(aggregationBuilder);
// List<Map<String, Object>> res = getGroupCount(esHighInit, "", sourceBuilder);//*查询真实日志文件数据(筛选条件并且聚合数据3)*SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//filter过滤无效,这里只能使用queryBoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.termQuery("fields.filetype.keyword", "jar-log"));boolQueryBuilder.must(QueryBuilders.termQuery("log.file.path.keyword", "/home/es/jar-log/txt.log"));boolQueryBuilder.must(QueryBuilders.rangeQuery("@timestamp").gte("2023-03-14 09:37:00").lte("2023-03-18 09:40:00").format("yyyy-MM-dd HH:mm:ss").timeZone("+08:00"));searchSourceBuilder.query(boolQueryBuilder);//设置聚合字段TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("logCount").field("fields.filetype.keyword");searchSourceBuilder.aggregation(aggregationBuilder);//查询List<Map<String, Object>> res = getGroupCount(esHighInit, "", searchSourceBuilder);esHighInit.close();}
二、不常用工具类
1. 获取某个字段最小、最大、平均值
public static void getdata1() throws IOException {RestHighLevelClient restHighLevelClient = getEsHighInit();//1.创建 SearchRequest搜索请求,并指定要查询的索引SearchRequest searchRequest = new SearchRequest("index_test");//2.创建 SearchSourceBuilder条件构造。SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//查询员工的最低最高和平均工资MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxSalary").field("count");MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("minSalary").field("count");AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avgSalary").field("count");searchSourceBuilder.aggregation(maxAggregationBuilder);searchSourceBuilder.aggregation(minAggregationBuilder);searchSourceBuilder.aggregation(avgAggregationBuilder);//3.将 SearchSourceBuilder 添加到 SearchRequest中searchRequest.source(searchSourceBuilder);//4.执行查询SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//5.解析查询结果System.out.println(searchResponse);System.out.println("花费的时长:" + searchResponse.getTook());Aggregations aggregations = searchResponse.getAggregations();System.out.println("aggregations:" + aggregations);ParsedMax maxSalary = aggregations.get("maxSalary");ParsedMin minSalary = aggregations.get("minSalary");ParsedAvg avgSalary = aggregations.get("avgSalary");System.out.println("maxSalary:" + maxSalary);System.out.println("最小" + maxSalary.getValue());System.out.println("最大" + minSalary.getValue());System.out.println("平均" + avgSalary.getValue());}
2. 获取某个字段最小、最大、平均值、个数、和
public static void getdata2() throws IOException {RestHighLevelClient restHighLevelClient = getEsHighInit();//1.创建 SearchRequest搜索请求,并指定要查询的索引SearchRequest searchRequest = new SearchRequest("index_test");//2.创建 SearchSourceBuilder条件构造。SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//对salary进行统计StatsAggregationBuilder statsAggregationBuilder = AggregationBuilders.stats("statSalary").field("count");searchSourceBuilder.aggregation(statsAggregationBuilder);//3.将 SearchSourceBuilder 添加到 SearchRequest中searchRequest.source(searchSourceBuilder);//4.执行查询SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//5.解析查询结果System.out.println("花费的时长:" + searchResponse.getTook());Aggregations aggregations = searchResponse.getAggregations();System.out.println("aggregations:" + aggregations);ParsedStats statSalary = aggregations.get("statSalary");System.out.println("统计个数" + statSalary.getCount());System.out.println("统计平均" + statSalary.getAvg());System.out.println("统计最高" + statSalary.getMaxAsString()); //可以转StringSystem.out.println("统计最低" + statSalary.getMin());System.out.println("统计和" + statSalary.getSum());}
3. 搜索结果去重统计
public static void getdata3() throws IOException {RestHighLevelClient restHighLevelClient = getEsHighInit();//1.创建 SearchRequest搜索请求,并指定要查询的索引SearchRequest searchRequest = new SearchRequest("index_test");//2.创建 SearchSourceBuilder条件构造。SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//cardinate对搜索结果去重统计CardinalityAggregationBuilder cardinalityAggregationBuilder = AggregationBuilders.cardinality("jobCardinate").field("count");searchSourceBuilder.aggregation(cardinalityAggregationBuilder);//3.将 SearchSourceBuilder 添加到 SearchRequest中searchRequest.source(searchSourceBuilder);//4.执行查询SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//5.解析查询结果System.out.println("花费的时长:" + searchResponse.getTook());Aggregations aggregations = searchResponse.getAggregations();System.out.println("aggregations:" + aggregations);ParsedCardinality cardinality = aggregations.get("jobCardinate");System.out.println("字段:" + cardinality.getName());System.out.println("不重复的个数" + cardinality.getValue());}
4. 按照字段的 Range 分桶
public static void getdata6() throws IOException {RestHighLevelClient restHighLevelClient = getEsHighInit();//1.创建 SearchRequest搜索请求,并指定要查询的索引SearchRequest searchRequest = new SearchRequest("index_test");//2.创建 SearchSourceBuilder条件构造。SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// Salary Range分桶,可以自己定义 keyRangeAggregationBuilder rangeAggregationBuilder = AggregationBuilders.range("salary_range").field("count").addUnboundedTo(1).addRange(1, 2).addUnboundedFrom(">2", 20000);searchSourceBuilder.aggregation(rangeAggregationBuilder);//3.将 SearchSourceBuilder 添加到 SearchRequest中searchRequest.source(searchSourceBuilder);//4.执行查询SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//5.解析查询结果System.out.println("花费的时长:" + searchResponse.getTook());SearchHits hits = searchResponse.getHits();System.out.println("符合条件的总文档数量:" + hits.getTotalHits().value);//聚合信息Aggregations aggregations = searchResponse.getAggregations();System.out.println("aggregations:" + aggregations);ParsedRange salaryRange = aggregations.get("salary_range"); //注意类型System.out.println("字段:" + salaryRange.getName());List<? extends Range.Bucket> buckets = salaryRange.getBuckets();for (Range.Bucket bucket : buckets) {System.out.println("getKey:" + bucket.getKey());System.out.println("getKeyAsString:" + bucket.getKeyAsString());System.out.println("getDocCount:" + bucket.getDocCount());System.out.println("getFromAsString:" + bucket.getFromAsString());System.out.println("getToAsString:" + bucket.getToAsString());}}