es~ElasticsearchTemplate的查詢和聚合


查詢條件

主要包含了以下幾個

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

match

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

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

改成and,並且的關系

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

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

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

多字段查詢 muti_match

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

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

詞條查詢term

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

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

-1

聚合

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

Fielddata is disabled on text fields by default.

通過postman等工作像es api發送請求,可以將字段的這個特性打開.

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);
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM