es~ElasticsearchTemplate的查詢和聚合

查詢條件

主要包含了如下幾個api

  1. match_all
  2. match
  3. term
  4. range

match

match類型查詢,會把查詢條件進行分詞,而後再查詢,詞條之間是or關係,按照相關性得分排序。app

GET /lind/_search
{
  "query": {
    "match":{
      "name": "hello world"
    }
  }
}

改爲and,而且的關係elasticsearch

GET /lind/_search
{
     "query":{
       "match":{
         "title":{
            "query":"中國生活",
            "operator":"and"
         }
       }
     }
}

minimum_should_match參數:match支持使用minimum_should_match 最小匹配參數,一般設置爲一個百分數.
用戶給定的條件分詞後,有3個詞,可是其中的2個是在描述他想要搜索的內容,那咱們使用minimum_should_match就是最好的選擇!post

GET /lind/_search
{
     "query":{
       "match":{
         "title":{
            "query":"中國人",
            "minimum_should_match":"75%"
         }
       }
     }
}

多字段查詢 muti_match

muti_match和match同樣,可是不一樣的是它能夠同時在多個字段中檢索ui

GET /lind/_search
{
     "query":{
       "multi_match":{
            "query":"國產",
            "fields":["title","name"]
       }
     }

詞條查詢term

它被用做精確查詢,好比數字,時間,布爾,和字段屬性爲keyword類型的關鍵字,後面講的聚合也只支持精確字段,而分詞字段text是不被支持的。code

GET /lind/_search
{
  "query": {
    "term": {
      "sex": {
        "value": "中國"
      }
    }
  }
}

-1

聚合

聚合操做,咱們能夠對數據進行分組的求和,求數,最大值,最小值,或者其它的自定義的統計功能,es對聚合有着不錯的支持,須要注意的是,在對某字段進行聚合以後,須要開啓這個字段的fielddata我,或者會出現以下錯誤:對象

Fielddata is disabled on text fields by default.

經過postman等工做像es api發送請求,能夠將字段的這個特性打開.blog

PUT /esdto/esdto/_mapping

{
  "properties": {
    "sex": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

pic
使用ElasticsearchTemplate對sex字段進行聚合排序

// 建立一個查詢條件對象
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        // 拼接查詢條件
        queryBuilder.should(QueryBuilders.termQuery("creator", "1"));
        // 建立聚合查詢條件
        TermsAggregationBuilder agg = AggregationBuilders.terms("sex").field("sex.keyword");//keyword表示不使用分詞進行聚合
        // 建立查詢對象
        SearchQuery build = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder) //添加查詢條件
                .addAggregation(agg) // 添加聚合條件
                .withPageable(PageRequest.of(0, 10)) //符合查詢條件的文檔分頁(不是聚合的分頁)
                .build();

        // 執行查詢
        AggregatedPage<TestEsDto> testEntities = elasticsearchTemplate.queryForPage(build, TestEsDto.class);
        // 取出聚合結果
        Aggregations entitiesAggregations = testEntities.getAggregations();
        Terms terms = (Terms) entitiesAggregations.asMap().get("sex");
        // 遍歷取出聚合字段列的值,與對應的數量
        for (Terms.Bucket bucket : terms.getBuckets()) {
            String keyAsString = bucket.getKeyAsString(); // 聚合字段列的值
            long docCount = bucket.getDocCount();// 聚合字段對應的數量
            log.info("keyAsString={},value={}", keyAsString, docCount);
        }
相關文章
相關標籤/搜索