elasticsearch结合Java Api操作


一、es6.8版本后进行了比较大的改动,包括Api操作

1、pom依赖

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.8.1</version>
        </dependency>

es6.8以后,官方给出了两种请求api,一个是高级,一个是低级,官方建议换成高级,并且抛弃了以前的transportClient这个api,目前的高级只不过是对低级的封装。

 <!-- 低级 -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.8.1</version>
        </dependency>

        <!-- 高级 -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.8.1</version>
        </dependency>

2、连接池api

//高级
    public RestHighLevelClient getEsHighInit() throws Exception {
        RestClientBuilder http = RestClient.builder(new HttpHost("192.168.1.1", 111, "http"))
                .setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
                    @Override
                    public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                        requestConfigBuilder.setConnectTimeout(10000);
                        requestConfigBuilder.setSocketTimeout(10000);
                        requestConfigBuilder.setConnectionRequestTimeout(10000);

                        return requestConfigBuilder;
                    }
                }).setMaxRetryTimeoutMillis(60 * 10000);
        return new RestHighLevelClient(http);

    }
//低级
    public RestClientBuilder getEsLowInit() throws Exception {
        RestClientBuilder http = RestClient.builder(new HttpHost("192.168.1.1", 111, "http"))
                .setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
                    @Override
                    public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                        requestConfigBuilder.setConnectTimeout(10000);
                        requestConfigBuilder.setSocketTimeout(10000);
                        requestConfigBuilder.setConnectionRequestTimeout(100000);
                        return requestConfigBuilder;
                    }
                }).setMaxRetryTimeoutMillis(60 * 10000);
        return  http;
    }

二、根据kibana语句的Java api查询

1、根据索引名查询数据,不含任何条件,默认返回十条
GET alert/_search
{
  "query": {
    "match_all": {}
  }
}
======
    @Test
    public void test(){
        EsTestApplicationTests esTestController = new EsTestApplicationTests();
        RestHighLevelClient esHighInit = null;
        try {
            esHighInit = esTestController.getEsHighInit();
            SearchRequest searchRequest = new SearchRequest("alert");
            SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = search.getHits();
            SearchHit[] hits1 = hits.getHits();
            for (SearchHit documentFields : hits1) {
                Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
                System.out.println(sourceAsMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
2、根据时间和索引查询数据
GET alert/_search
{
  "query": {
   "bool": {
     "filter": {
       "range": {
         "timefirst": {
           "gte": 0,
           "lte": 1610209248000
         }
       }
     }
   }
  }
}
//借助QueryBuilders工具类查询,QueryBuilders可以构建查询条件
    @Test
    public void test(){
        EsTestApplicationTests esTestController = new EsTestApplicationTests();
        RestHighLevelClient esHighInit = null;
        try {
            esHighInit = esTestController.getEsHighInit();
            SearchRequest searchRequest = new SearchRequest("alert");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQuery =
                    QueryBuilders.boolQuery()
                            .filter(QueryBuilders.rangeQuery("timefirst")
                                    .gte(0).lte(1610209248000L));
            searchSourceBuilder.query(boolQuery);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = search.getHits();
            SearchHit[] hits1 = hits.getHits();
            for (SearchHit documentFields : hits1) {
                Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
                System.out.println(sourceAsMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
3、根据条件一定存在某个字段进行查询
GET alert/_search
{
  "query": {
   "bool": {
     "must": [
       {
         "exists": {
           "field": "level"
         }
       },
           {
           "exists":{
              "field":"src" 
              }
           }
     ]
   }
  }
}
  @Test
    public void test(){
        EsTestApplicationTests esTestController = new EsTestApplicationTests();
        RestHighLevelClient esHighInit = null;
        try {
            esHighInit = esTestController.getEsHighInit();
            SearchRequest searchRequest = new SearchRequest("alert");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQuery =
                    QueryBuilders.boolQuery()
                            .must(QueryBuilders.existsQuery("level")).must(QueryBuilders.existsQuery("src"));
            searchSourceBuilder.query(boolQuery);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = search.getHits();
            SearchHit[] hits1 = hits.getHits();
            for (SearchHit documentFields : hits1) {
                Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
                System.out.println(sourceAsMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
4、根据索引和所在多个ip值进行查询数组查询
GET alert/_search
{
  "query": {
   "bool": {
     "filter": {
       "terms": {
         "entityip": [
           "10.67.9.1",
           "172.17.0.1"
         ]
       }
     }
   }
  }
}
=============
    @Test
    public void test(){
        EsTestApplicationTests esTestController = new EsTestApplicationTests();
        RestHighLevelClient esHighInit = null;
        try {
            esHighInit = esTestController.getEsHighInit();
            SearchRequest searchRequest = new SearchRequest("alert");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQuery =
                    QueryBuilders.boolQuery()
                            .filter(QueryBuilders.termsQuery("entityip","10.67.9.1","172.17.0.1"));
            searchSourceBuilder.query(boolQuery);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = search.getHits();
            SearchHit[] hits1 = hits.getHits();
            for (SearchHit documentFields : hits1) {
                Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
                System.out.println(sourceAsMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
5、根据索引和某个字段前缀值查询数据
GET alert/_search
{
  "query": {
   "bool": {
     "should":[
			  //满足以下三个其中的任意一个都为攻击
         { "prefix": { "entitytype": "security"}
         }
         ]
   }
  }
}
=======================================
SearchRequest searchRequest = new SearchRequest("alert");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery =
        QueryBuilders.boolQuery()
                .should(QueryBuilders.prefixQuery("entitytype","security"));
searchSourceBuilder.query(boolQuery);
searchRequest.source(searchSourceBuilder);
SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
6、根据索引和某个字段的值查询
GET alert/_search
{
  "query": {
   "bool": {
     "should": [
         { "match": { "entityname": "LanSecS" }
         }
     ]
   }
  }
}

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery =
QueryBuilders.boolQuery()
      .should(QueryBuilders.matchQuery("entityname","LanSecS"));
searchSourceBuilder.query(boolQuery);
searchRequest.source(searchSourceBuilder);
SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
7、根据索引和某个字段的值集合分组
//aggs分组聚合查询
GET alert/_search
{
  "aggs": {
    "my_aggs": {
       "terms":{
       //字段.keyword是将entityname这个字段转化为字符串
            "field": "entityname.keyword"
        }
    }
  }, 
  "size": 1
}
  @Test
    public void test2(){
        EsTestApplicationTests esTestController = new EsTestApplicationTests();
        RestHighLevelClient esHighInit = null;
        try {
            esHighInit = esTestController.getEsHighInit();
            SearchRequest searchRequest = new SearchRequest("alert");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            TermsAggregationBuilder entityname = AggregationBuilders.terms("my_aggs").field("entityname.keyword");
                   // .subAggregation();
            searchSourceBuilder.aggregation(entityname);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
            ParsedStringTerms gradeTerms = (ParsedStringTerms) search.getAggregations().getAsMap().get("my_aggs");
            List<? extends Terms.Bucket> buckets = gradeTerms.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                String keyAsString = bucket.getKeyAsString();
                System.out.println(keyAsString);
                long docCount = bucket.getDocCount();
                System.out.println(docCount);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

结果,key为entityname的值,doc_count为这个值的数量,如同mysql分组,可以用来查询统计数据
在这里插入图片描述

8、根据索引和多个字段的值聚合分组
//用entityname和orgid进行多字段聚合
GET alert/_search
{
  "aggs": {
    "my_aggs": {
       "terms":{
            "field": "entityname.keyword"
        },
    "aggs": {
      "my_aggs2": {
        "terms": {
          "field": "orgid.keyword"
        }
      }
    }
    }
  },
    "size": 1
}
=======================================
    @Test
    public void test2(){
        EsTestApplicationTests esTestController = new EsTestApplicationTests();
        RestHighLevelClient esHighInit = null;
        try {
            esHighInit = esTestController.getEsHighInit();
            SearchRequest searchRequest = new SearchRequest("alert");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            TermsAggregationBuilder entityname = AggregationBuilders.terms("my_aggs").field("entityname.keyword");
            entityname.subAggregation(AggregationBuilders.terms("my_aggs2").field("orgid.keyword"));
                   // .subAggregation();
            searchSourceBuilder.aggregation(entityname);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = esHighInit.search(searchRequest, RequestOptions.DEFAULT);
            ParsedStringTerms gradeTerms = (ParsedStringTerms) search.getAggregations().getAsMap().get("my_aggs");
            List<? extends Terms.Bucket> buckets = gradeTerms.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                String keyAsString = bucket.getKeyAsString();
                System.out.println(keyAsString);
                long docCount = bucket.getDocCount();
                System.out.println(docCount);
                ParsedStringTerms gradeTerms2 = (ParsedStringTerms) bucket.getAggregations().getAsMap().get("my_aggs2");
                List<? extends Terms.Bucket> buckets1 = gradeTerms2.getBuckets();
                for (Terms.Bucket bucket1 : buckets1) {
                    String keyAsString2 = bucket1.getKeyAsString();
                    System.out.println(keyAsString2);
                    long docCount2 = bucket1.getDocCount();
                    System.out.println(docCount2);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

返回结果
在这里插入图片描述

8、根据索引和必在,前缀,必值,多个字段的值聚合分组,多方式集合
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会改bug的程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值