java elastic 常用查詢

java Elastic 客戶端基本使用

引入jar

   compile 'org.elasticsearch:elasticsearch:5.5.0'

   compile 'org.elasticsearch.client:transport:5.5.0

client基本使用

得到client

Settings settings = Settings.builder().put("cluster.name", "lw-6-test").build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.10.10.6"), 9300));

關(guān)閉資源

client.close();
  • 搜索關(guān)鍵字全部要小寫溯祸。

get得到指定index type id的數(shù)據(jù)

  public static void prepareGet(TransportClient client) throws Exception {
        GetResponse response = client.prepareGet("mytest", "test", "p1").get();
        System.out.println(response);
    }
    
 output:
 
{"_index":"mytest","_type":"test","_id":"p1","_version":1,"found":true,"_source":{"name":"mac Book 筆記本",
"price":1233,
"description":"這是筆記本",
"cats":["3c","computer"]

}
}
    
    

insert添加數(shù)據(jù)

  public static void insert(TransportClient client) throws Exception {
        Map<String,Object> resource = new HashMap<>();
        resource.put("name","mac Note");
        resource.put("price",8877);
        resource.put("description","mac Note 新款");
        IndexRequestBuilder index = client.prepareIndex("mytest", "test");

        IndexResponse insertResponse = index.setSource(resource).execute().get();

        System.out.println(insertResponse);
    }
    
    
output:
    IndexResponse[index=mytest,type=test,id=AV8CZmTgGnilLCUrybiV,version=1,result=created,shards={"total":2,"successful":1,"failed":0}]

delete刪除數(shù)據(jù)

  public static void delete(TransportClient client) throws Exception{
        BulkByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
                .filter(QueryBuilders.matchQuery("name", "mac")) //搜索
                .source("mytest") //index
                .get();


       long deleted = response.getDeleted();
       System.out.println("刪除個(gè)數(shù): "+deleted);

    }
       

update 修改數(shù)據(jù)

 public static void update(TransportClient client) throws Exception{

        Map<String,Object> data = new HashMap<>();
        data.put("name","new mac node");

        UpdateRequest updateRequest =  new UpdateRequest();
        updateRequest.index("mytest");
        updateRequest.type("test");
        updateRequest.id("AV8CfcSLGnilLCUryoEl");

        updateRequest.doc(data);

        UpdateResponse response = client.update(updateRequest).get();
        System.out.println(response);

    }
    
output:
UpdateResponse[index=mytest,type=test,id=AV8CfcSLGnilLCUryoEl,version=2,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]

MultiGet查詢多個(gè)index

    public static void multiIndex(TransportClient client) throws Exception {
        MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
                .add("mytest","test","AV8CfcSLGnilLCUryoEl") //多個(gè)index
                .add("instestdb_business_log-2017.09","instestdb_business_log","AV7KHPtGDF9uyeK_lXln") //多個(gè)index
                .get();

        for(MultiGetItemResponse itemResponses : multiGetItemResponses) {
            GetResponse response = itemResponses.getResponse();
            if(response.isExists()) { 
                String json = response.getSourceAsString(); //獲取到_source field
                System.out.println(json);
            }

        }
        
    }

Bulk API 一次請(qǐng)求多個(gè)添加和刪除

 public static void BulkRequest(TransportClient client) throws Exception {
        BulkRequestBuilder bulkRequest = client.prepareBulk();

        IndexRequestBuilder index1 = client.prepareIndex("mytest", "test");
        IndexRequestBuilder index2 = client.prepareIndex("mytest", "test");

        Map<String,Object> resource = new HashMap<>();
        resource.put("name","華碩");
        resource.put("price",5577);
        resource.put("description","華碩z460");

        index1.setSource(resource);

        Map<String,Object> resource1 = new HashMap<>();
        resource1.put("name","小米2");
        resource1.put("price",4577);
        resource1.put("description","新機(jī)超薄");

        index1.setSource(resource);
        index2.setSource(resource1);

        bulkRequest.add(index1);
        bulkRequest.add(index2);


        BulkResponse bulkResponse = bulkRequest.get();


        if(bulkResponse.hasFailures()) {
            System.out.println(bulkResponse.buildFailureMessage());
        }

        bulkResponse.forEach(response ->{
            System.out.println(response.getId());
        });

    }

query dsl 使用

import static org.elasticsearch.index.query.QueryBuilders.*;

 Settings settings = Settings.builder()
                .put("cluster.name", "lw-6-test").build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.10.10.6"), 9300));
        
        allquery(client); //具體的query dsl查詢

        client.close();

Match All Query 查詢所有的數(shù)據(jù)


    public static void allquery(TransportClient client) throws Exception{
        QueryBuilder qb = matchAllQuery();
        SearchResponse response = client.prepareSearch("mytest").setTypes("test").setSize(3).setQuery(qb).get();

        System.out.println("length: "+response.getHits().getHits().length );
        if(response.getHits().getTotalHits() != 0) {
            for (SearchHit hit : response.getHits().getHits()) {

                System.out.println(hit.getSourceAsString());
            }
        }
    }

Match Query 查詢單一條件的數(shù)據(jù)

  public static void myMatchQuery(TransportClient client) throws Exception {
        QueryBuilder qb = matchQuery("name","mac");
        
        SearchResponse response = client.prepareSearch("mytest").setTypes("test").setQuery(qb).get();
        System.out.println("length: "+response.getHits().getHits().length );
        if(response.getHits().getTotalHits() != 0) {
            for (SearchHit hit : response.getHits().getHits()) {
                System.out.println(hit.getScore()+" --> "+hit.getSourceAsString());
            }

        }
    }

MultiMatchQuery 在多個(gè)字段中查詢一個(gè)關(guān)鍵字

  QueryBuilder qb = multiMatchQuery("mac","description","name"); //mac是要搜索的詞 description祠墅,name 都是字段

Common Terms Query 搜索term

 public static void myCommonTermsQuery(TransportClient client ) throws Exception{
        QueryBuilder qb = commonTermsQuery("description","mac");
        print(qb,client);
    }

Simple Query String Query 簡(jiǎn)單字符串查詢可以使用正則

public static void mySimpleQueryString(TransportClient client ) {
        QueryBuilder qb = queryStringQuery("mac*^2").field("name");
        print(qb,client);
    }

term 搜索關(guān)鍵詞一個(gè)

 public static void myTermQuery(TransportClient client) {
        QueryBuilder qb = termQuery("name","mac2");
        print(qb,client);
    }

terms 搜索關(guān)鍵詞多個(gè)

   QueryBuilder qb = termsQuery("name_str","小米","戴爾");
   print2(qb,client);

range query 范圍搜索

  public static void myRangeQuery(TransportClient client){
        QueryBuilder qb = rangeQuery("price").from(3399)
                .to(6399)
                .includeLower(true)
                .includeUpper(false);

        print2(qb,client);
        
    }
    
    QueryBuilder qb = rangeQuery("price").gte(3399).lt(6399);
    

Exists Query 查找字段是否存在 存在則返回所有的數(shù)據(jù)果元,不存在返回0

    public static void myExistsQuery(TransportClient client) {
        QueryBuilder qb = existsQuery("name_str");
        print2(qb,client);
    }

Wildcard Query 通配符查詢

QueryBuilder qb = wildcardQuery("user", "k?mc*");

?

Regexp Query支持正則表達(dá)式的查詢

QueryBuilder qb = regexpQuery("name.first", "s.*y");

Fuzzy Query 模糊查詢

QueryBuilder qb = fuzzyQuery(
    "name",     
    "kimzhy"    
);

ids Query 根據(jù)id 查詢

QueryBuilder qb = idsQuery("my_type", "type2")
    .addIds("1", "4", "100");

QueryBuilder qb = idsQuery() 
    .addIds("AV8HhVC8FiG-4m4G2rYp","AV8HhVB6FiG-4m4G2rYm");

?

復(fù)合查詢

Contant Score Query 指定score

  QueryBuilder qb = constantScoreQuery(matchQuery("name_str", "聯(lián)想")).boost(3.0f);

Bool Query must mustNot should 查詢

所有的 must 子句必須匹配, 并且所有的 must_not 子句必須不匹配, 但是多少 should 子句應(yīng)
該匹配呢? 默認(rèn)的,不需要匹配任何 should 子句,一種情況例外:如果沒有must子句,就必須至少匹 配一個(gè)should子句愉昆。

GET mttest-2017.10.41/web1/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "request": "choosehospital/index"
          }
        },
        {
          "match": {
            "response": "500"
          }
        }
      ]
    }
  }
}

  public static void myBoolQuery(TransportClient client) {
        QueryBuilder qb = boolQuery().must(termQuery("name_str","小米"))
                .filter(matchQuery("price",3599))
                .filter(matchQuery("description","lihao"));
        print2(qb, client);
    }
    
    QueryBuilder qb = boolQuery()
    .must(termQuery("content", "test1"))    
    .must(termQuery("content", "test4"))    
    .mustNot(termQuery("content", "test2")) 
    .should(termQuery("content", "test3"))  
    .filter(termQuery("content", "test5"));
    

?

indices query查詢多個(gè)index

用來查詢多個(gè)index,對(duì)于指定內(nèi)的index,執(zhí)行指定的內(nèi)部query;對(duì)于指定外的index,執(zhí)行
no_match_query設(shè)定的條件
private static void print(QueryBuilder qb, TransportClient client) {
        SearchResponse response = client.prepareSearch("mytest").setTypes("test").setQuery(qb).get();
        System.out.println("length: " + response.getHits().getHits().length);
        if (response.getHits().getTotalHits() != 0) {
            for (SearchHit hit : response.getHits().getHits()) {
                System.out.println(hit.getScore() + " --> " + hit.getSourceAsString());
            }

        }
    }

    private static void print2(QueryBuilder qb, TransportClient client) {
        SearchResponse response = client.prepareSearch("mytest_1").setTypes("test").setQuery(qb).get();
        System.out.println("length: " + response.getHits().getHits().length);
        if (response.getHits().getTotalHits() != 0) {
            for (SearchHit hit : response.getHits().getHits()) {
                System.out.println(hit.getScore() + " --> " + hit.getSourceAsString());
            }

        }
    }

scroll分頁(yè)

 public static void main(String ...arg) throws Exception {

        //鏈接服務(wù)器
        Settings  settings = Settings.builder()
                .put("cluster.name","lw-6-test").build();

        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.10.10.6"), 9300));


        //設(shè)置搜索條件
        QueryBuilder qb = termQuery("name_str","筆記本");


        // 按照price 降序  每次查詢2條  第一次不需要設(shè)置sroll  scrollid
        SearchResponse scrollResp = client.prepareSearch("mytest_1").setTypes("test")
                .addSort("price", SortOrder.DESC)
                .setScroll(new TimeValue(30000))
                .setQuery(qb)
                .setSize(2).get();

        System.out.println("length: " + scrollResp.getHits().getHits().length);
        int count = 1;
        do{
            System.out.println("第 " +count+ " 次");
            System.out.println();
            for (SearchHit hit : scrollResp.getHits().getHits()){
                System.out.println(hit.getScore() + " --> " +hit.getSourceAsString());
            }


            System.out.println("scrollid:  "+scrollResp.getScrollId());

            //設(shè)置sroll id
            scrollResp =client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
            System.out.println();

            count++;

        } while (scrollResp.getHits().getHits().length !=0);


        client.close();

    }

?

prepareMultiSearch多個(gè)條件查詢

public class MultiSearchDemo {

    public static void main(String ...arg) throws Exception{
        Settings settings = Settings.builder().put("cluster.name", "lw-6-test").build();

        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.10.10.6"), 9300));


       QueryBuilder query1 = termQuery("name_str","小米");
       QueryBuilder query2 = termQuery("name_str","戴爾");

        SearchRequestBuilder srb1 = client.prepareSearch("mytest_1").setTypes("test").setQuery(query1);
        SearchRequestBuilder srb2 = client.prepareSearch("mytest_1").setTypes("test").setQuery(query2);

        MultiSearchResponse sr = client.prepareMultiSearch().add(srb1).add(srb2).get();

        long nbHits =0;
        for(MultiSearchResponse.Item item : sr.getResponses()) {
            SearchResponse response = item.getResponse();
            nbHits += response.getHits().getTotalHits();

            if(response.getHits().getHits().length >0) {

                for(SearchHit hit : response.getHits().getHits()) {
                    System.out.println(hit.getScore()+"  ----->  "+hit.getSourceAsString());
                }

            }
            System.out.println("-------------------------");
        }

        System.out.println(nbHits);

        client.close();

    }
}

聚合

概述

ES 的聚合框架提供對(duì)查詢得到的數(shù)據(jù)進(jìn)行分組和匯總統(tǒng)計(jì)股耽,以提供復(fù)雜的統(tǒng)計(jì)分析功能女轿。

ES支持在一次聚合查詢中丹鸿,可以同時(shí)得到聚合的具體結(jié)果并再次進(jìn)行聚合贪染,也就是聚合是可以嵌套的缓呛。

這非常有用,你可以通過一次操作得到多次聚合的結(jié)果,從而避免多次請(qǐng)求,減少網(wǎng)絡(luò)和服務(wù)器的負(fù)擔(dān)。

聚合的類型

1:Bucketing(桶)聚合:劃分不同的“桶”杭隙,將數(shù)據(jù)分配到不同的“桶” 里哟绊,然后再進(jìn)行聚合,非常類似sql 中的group 語(yǔ)句的含義痰憎。

2:Metric(指標(biāo))聚合:指標(biāo)聚合主要針對(duì)number類型的數(shù)據(jù)票髓,在一組文檔中,保持對(duì)要聚合的指標(biāo)的跟蹤和計(jì)算铣耘,需要ES做比較多的計(jì)算工作洽沟。

3:Pipeline(管道)聚合:用來聚合其它聚合輸出的結(jié)果以及相關(guān)指標(biāo)

聚合的基本語(yǔ)法

"aggregations" : {                      //定義聚合對(duì)象,也可用 "aggs"
    "<aggregation_name>" : {            //聚合的名稱,用戶自定義   
        "<aggregation_type>" : {         //聚合類型,比如 "histogram" "avg"
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*  ////定義額外的多個(gè)平級(jí)聚合,只有Bucketing類型才有意義
}

?

GET mytest_1/test/_search
{
  "aggs" : {
        "avg_price" : { "avg" : { "field" : "price" } }
    }
}

output
{ "aggregations": {
    "avg_price": {
      "value": 4954.555555555556
    }
  }

?
?

Metric 使用

求平均值

   public static void main(String ...arg) throws Exception {

        Settings settings = Settings.builder().put("cluster.name", "lw-6-test").build();

        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.10.10.6"),9300));


        avg(client);



        client.close();


    }
    
     private static void avg(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");

        SearchResponse sr = search.addAggregation(AggregationBuilders.avg("avg_price").field("price")).execute().actionGet();

        Avg result = sr.getAggregations().get("avg_price");
        System.out.println(result.getValue());
    }
    
    
    POST mytest_1/test/_search?size=0
{
  "aggs" : {
        
        "avg_price" : { 
          
          "avg" : { "field" : "price" } 
          
        }
    }
}
POST mytest_1/test/_search?size=0
{
   "aggs" : {
        "all_cats" : {
          "terms" : { "field" : "tag.keyword" },
              "aggs" : {
                  "avg_price" : {
                      "avg" : { "field" : "price" }
                  }

                
              }
        }
     
   }
}


  "aggregations": {
    "all_cats": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "筆記本",
          "doc_count": 8,
          "avg_price": {
            "value": 5124
          }
        },
        {
          "key": "聯(lián)想",
          "doc_count": 4,
          "avg_price": {
            "value": 5649
          }
        },
        {
          "key": "小米",
          "doc_count": 2,
          "avg_price": {
            "value": 4399
          }
        },
        {
          "key": "惠普",
          "doc_count": 1,
          "avg_price": {
            "value": 2399
          }
        },
        {
          "key": "戴爾",
          "doc_count": 1,
          "avg_price": {
            "value": 7199
          }
        }
      ]
    }
  }

分類求取平均值

PUT mytest_1/_mapping/test
{
  "properties": {
    "tag": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

    private static void avg1(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setSize(0).setTypes("test");

        TermsAggregationBuilder tag = AggregationBuilders.terms("tags").field("tag.keyword");
        AvgAggregationBuilder price = AggregationBuilders.avg("avg_price").field("price");
        tag.subAggregation(price);

        SearchResponse sr = search.addAggregation(tag).execute().actionGet();

        System.out.println(sr);
    }


Cardinality 去除重復(fù)數(shù)據(jù)

用來對(duì)單個(gè)數(shù)據(jù)進(jìn)行匯總,計(jì)算不重復(fù)的值的數(shù)量。

    public static void main(String... arg) throws Exception {

        Settings settings = Settings.builder().put("cluster.name", "lw-6-test").build();

        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.10.10.6"), 9300));


        cardinality(client);


        client.close();


    }
    
  private static void cardinality(TransportClient client) {

        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");
        SearchResponse sr = search.addAggregation(AggregationBuilders.cardinality("type_count").field("price")).execute().actionGet();

        Cardinality result = sr.getAggregations().get("type_count");

        System.out.println("type_count: "+result.getValue());

    }
    
    
POST mytest_1/test/_search?size=0
{
    "aggs" : {
        "type_count" : {
            "cardinality" : {
                "field" : "price"
            }
        }
    }
}

out:
{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "type_count": {
      "value": 6
    }
  }
}

?
?

Stats 聚合操作 count min max avg sum

    private static void stats(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");
        SearchResponse sr =  search.addAggregation(AggregationBuilders.stats("price_stats").field("price")).execute().actionGet();

       Stats stats = sr.getAggregations().get("price_stats");
        System.out.println(stats.getAvgAsString());
        System.out.println(stats.getMaxAsString());
        System.out.println(stats.getMinAsString());
        System.out.println(stats.getSumAsString());

    }
    
    
POST mytest_1/test/_search?size=0
{
    "aggs" : {
        "price_stats" : { "extended_stats" : { "field" : "price" } }
    }
}

out:
 "aggregations": {
    "price_stats": {
      "count": 8,
      "min": 2399,
      "max": 7199,
      "avg": 5124,
      "sum": 40992,
      "sum_of_squares": 231958008,
      "variance": 2739375,
      "std_deviation": 1655.1057368035433,
      "std_deviation_bounds": {
        "upper": 8434.211473607087,
        "lower": 1813.7885263929134
      }
    }
  }

?

Percentiles 百分比 查看一個(gè)百分比對(duì)應(yīng)的值

這是一個(gè)多值的指標(biāo)聚集,用來計(jì)算聚合文檔中,在某個(gè)百分比或某個(gè)區(qū)間,所對(duì)應(yīng)的觀測(cè)值,

1:缺省的percentile的區(qū)間是[ 1, 5, 25, 50, 75, 95, 99 ]蜗细。

2:觀測(cè)值通常都是近似的,有很多不同的算法來計(jì)算裆操。
?
? 例如:第九十五個(gè)百分值是大于所觀察到的值的95%的值怒详。

POST mytest_1/test/_search?size=0
{
    "aggs" : {
        "price_percent" : {
            "percentiles" : {
                "field" : "price" 
            }
        }
    }
}

POST mytest_1/test/_search?size=0
{
    "aggs" : {
        "price_percent" : {
            "percentiles" : {
                "field" : "price" ,
                "percents" : [0.1,50,95, 99, 100]  //自定義百分比區(qū)間
            }
        }
    }
}


  "aggregations": {
    "price_percent": {
      "values": {
        "1.0": 2468.9999999999995,
        "5.0": 2749,
        "25.0": 3549,
        "50.0": 5799,
        "75.0": 6399,
        "95.0": 6918.999999999999,
        "99.0": 7143
      }
 private static void percentile(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");
        SearchResponse sr =  search.addAggregation(AggregationBuilders.percentiles("price_percent").field("price")).execute().actionGet();

       Percentiles percentile = sr.getAggregations().get("price_percent");

       System.out.println(percentile.percentileAsString(80));
    }

    //自定義百分比區(qū)間
    private static void percentile2(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");
        SearchResponse sr =  search.addAggregation(AggregationBuilders.percentiles("price_percent").percentiles(0.1,50,95, 99, 100).field("price")).execute().actionGet();

        System.out.println(sr);
        Percentiles percentile = sr.getAggregations().get("price_percent");

        System.out.println(percentile.percentileAsString(80));
    }

?

Value Count 計(jì)算聚合值的數(shù)量

POST mytest_1/test/_search?size=0
{
"aggs" : {
        "types_count" : { "value_count" : { "field" : "price" } }
    }
    
}  

out:
"aggregations": {
    "types_count": {
      "value": 8
    }
 private static void valueCount(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");
        SearchResponse sr =search.addAggregation(AggregationBuilders.count("value_count").field("price")).execute().actionGet();
       ValueCount valueCount = sr.getAggregations().get("value_count");
       System.out.println(valueCount.getValue());

    }

?

TOP hits

用來取符合條件的前n條數(shù)據(jù)。 包含的選項(xiàng)有:from踪区、size昆烁、sort。

    private static void topHits(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test");

        TopHitsAggregationBuilder addtion = AggregationBuilders.topHits("top_price_hits").sort("price", SortOrder.DESC).fieldDataField("price")
                .size(5);

        SearchResponse sr =search.addAggregation(addtion).execute().actionGet();
       TopHits topHits = sr.getAggregations().get("top_price_hits");
       System.out.println();
        SearchHit[] hits = topHits.getHits().internalHits();
        for(SearchHit searchHit : hits) {
            System.out.println(searchHit.getSourceAsString());

        }

    }

?
?

bucket 使用

Histogram

條形圖聚合缎岗,根據(jù)文檔中的謀改革字段來分組静尼。一個(gè)文檔屬于某個(gè)通,計(jì)算過程大致如下:

rem = value % interval
if (rem < 0) {
    rem += interval
}
bucket_key = value - rem

1:可配置的參數(shù):
(1)field:字段,必須為數(shù)值類型

(2)interval:分桶間距 (3)min_doc_count:最少文檔數(shù),桶過濾,只有不少于這么多文檔的桶才會(huì)返回

(4)extended_bounds:范圍擴(kuò)展

(5)order:對(duì)桶排序,如果 histogram 聚合有一個(gè)權(quán)值聚合類型的“直接”子聚合,那么排序可以使用 子聚合中的結(jié)果

(6)offset:桶邊界位移,默認(rèn)從0開始 (7)keyed:hash結(jié)構(gòu)返回,默認(rèn)以數(shù)組形式返回每一個(gè)桶 (8)missing:配置缺省默認(rèn)值

POST mytest_1/test/_search?size=0
{
    "aggs" : {
        "prices" : {
            "histogram" : {
                "field" : "price",
                "interval" : 2000
            }
        }
    }
}

out:
 "aggregations": {
    "prices": {
      "buckets": [
        {
          "key": 2000,
          "doc_count": 3
        },
        {
          "key": 4000,
          "doc_count": 1
        },
        {
          "key": 6000,
          "doc_count": 4
        }
      ]
    }

  private static void histogram(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test").setSize(0);
        HistogramAggregationBuilder addtion = AggregationBuilders.histogram("prices").interval(2000).field("price");

        SearchResponse sr = search.addAggregation(addtion).execute().actionGet();

       Histogram histogram = sr.getAggregations().get("prices");
       histogram.getBuckets().forEach(bucket->{
           System.out.println(bucket.getKeyAsString()+" ---->  "+bucket.getDocCount());
       });
    }

Range

范圍聚合传泊,是對(duì)某個(gè)字段的值鼠渺,按照設(shè)定的范圍進(jìn)行分組。

POST mytest_1/test/_search?size=0
{
    "aggs" : {
        "price_ranges" : {
            "range" : {
                "field" : "price",
                "ranges" : [
                    { "to" : 3000 },
                    { "from" : 3000, "to" : 5000 },
                    { "from" : 5000 }
                ]
            }
        }
    }
}

out:
"aggregations": {
    "price_ranges": {
      "buckets": [
        {
          "key": "*-3000.0",
          "to": 3000,
          "doc_count": 1
        },
        {
          "key": "3000.0-5000.0",
          "from": 3000,
          "to": 5000,
          "doc_count": 2
        },
        {
          "key": "5000.0-*",
          "from": 5000,
          "doc_count": 5
        }
      ]
    }
   private static void range(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test").setSize(0);
        AggregationBuilder addtion = AggregationBuilders.range("price_ranges").field("price")
                .addUnboundedTo(3000)
                .addRange(3000,5000)
                .addUnboundedFrom(5000);

        SearchResponse sr = search.addAggregation(addtion).execute().actionGet();

       Range histogram = sr.getAggregations().get("price_ranges");
       histogram.getBuckets().forEach(bucket->{
           String key = bucket.getKeyAsString();
           String from = bucket.getFromAsString();
           String to = bucket.getToAsString();
           long count = bucket.getDocCount();
           System.out.println("key : "+key+"\t form: "+from+"\t to:"+to+"\t count:"+count);
       });
    }

Date Range

Ip Range

Terms

詞元聚合或渤,以指定的字段內(nèi)的每一個(gè)不重復(fù)的term來分組系冗,并計(jì)算每個(gè)組內(nèi)文檔的個(gè)數(shù)。

POST mytest_1/test/_search?size=0
{
   "aggs" : {
        "all_cats" : {
          "terms" : { "field" : "tag.keyword" }
     
        }
     
   }
}

Filters 過濾

多過濾聚合薪鹦,用多個(gè)過濾條件掌敬,來對(duì)當(dāng)前文檔進(jìn)行過濾的聚合,每個(gè)過濾都包含所有滿足它的文檔池磁,

多個(gè)bucket中可能重復(fù)奔害。

POST mytest_1/test/_search?size=0
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "filters" : {
          "filter1" :   { "match" : { "tag" : "小米"   }},
          "filter2" : { "match" : { "tag" : "戴爾" }}
        }
      }
    }
  }
}

out:
"aggregations": {
    "messages": {
      "buckets": {
        "filter1": {
          "doc_count": 2
        },
        "filter2": {
          "doc_count": 1
        }
      }
    }


private static  void filters(TransportClient client) {
        SearchRequestBuilder search = client.prepareSearch("mytest_1").setTypes("test").setSize(0);

        AggregationBuilder aggregation = AggregationBuilders.filters("filters",
                new FiltersAggregator.KeyedFilter("xiaomi",matchQuery("tag","小米")),
                new FiltersAggregator.KeyedFilter("daier",matchQuery("tag","戴爾"))
        );
        SearchResponse sr = search.addAggregation(aggregation).execute().actionGet();
        System.out.println(sr);
        Filters agg =sr.getAggregations().get("filters");
        agg.getBuckets().forEach(entry->{
            String key = entry.getKeyAsString();            // bucket key
            long docCount = entry.getDocCount();
            System.out.println("key : "+key+"\t docCount: "+docCount);
        });


    }

技術(shù)點(diǎn)

分詞

分詞安裝

https://github.com/medcl/elasticsearch-analysis-ik/tree/v5.5.0

測(cè)試分詞

GET _analyze
{
  "analyzer": "ik_smart",
  "text": ["中華人民共和國(guó)"]
  
}

參數(shù)

boost:權(quán)重,缺省1.0

bool

bool 過濾 :可以用來合并多個(gè)過濾條件查詢結(jié)果的布爾邏輯,它包含一下操作符:

must:多個(gè)查詢條件的完全匹配,相當(dāng)于 and。

must_not: 多個(gè)查詢條件的相反匹配,相當(dāng)于 not地熄。

should: 至少有一個(gè)查詢條件匹配, 相當(dāng)于 or华临。
?

參考文檔

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/_structuring_aggregations.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市端考,隨后出現(xiàn)的幾起案子雅潭,更是在濱河造成了極大的恐慌,老刑警劉巖却特,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扶供,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡裂明,警方通過查閱死者的電腦和手機(jī)椿浓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闽晦,“玉大人扳碍,你說我怎么就攤上這事∠沈龋” “怎么了笋敞?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荠瘪。 經(jīng)常有香客問我液样,道長(zhǎng)振亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任鞭莽,我火速辦了婚禮坊秸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澎怒。我一直安慰自己褒搔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布喷面。 她就那樣靜靜地躺著星瘾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惧辈。 梳的紋絲不亂的頭發(fā)上琳状,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音盒齿,去河邊找鬼念逞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛边翁,可吹牛的內(nèi)容都是我干的翎承。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼符匾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼叨咖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啊胶,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甸各,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后焰坪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痴晦,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年琳彩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片部凑。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡露乏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涂邀,到底是詐尸還是另有隱情瘟仿,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布比勉,位于F島的核電站劳较,受9級(jí)特大地震影響驹止,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜观蜗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一臊恋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墓捻,春花似錦抖仅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梧兼,卻和暖如春放吩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羽杰。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工渡紫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忽洛。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓腻惠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親欲虚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子集灌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容