中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

es~ElasticsearchTemplate的查(cha)詢(xun)和聚(ju)合(he)

查詢條件

主要包含了以下幾個

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

match

match類型查(cha)詢,會把(ba)查(cha)詢條(tiao)件進(jin)行(xing)分(fen)詞(ci),然后再查(cha)詢,詞(ci)條(tiao)之間是or關系,按照(zhao)相關性(xing)得分(fen)排(pai)序。

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

改(gai)成and,并且的關系

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

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

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

多字段查詢 muti_match

muti_match和match一樣,但是(shi)不同的是(shi)它可(ke)以(yi)同時在多個字段中(zhong)檢索

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

詞條查詢term

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

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

-1

聚合

聚(ju)合操作,我們可以對數據進(jin)行(xing)分組的(de)(de)求(qiu)和,求(qiu)數,最大值(zhi),最小值(zhi),或(huo)者其它的(de)(de)自定(ding)義的(de)(de)統(tong)計功能(neng),es對聚(ju)合有著(zhu)不(bu)錯的(de)(de)支持,需要(yao)注意的(de)(de)是,在對某(mou)字段(duan)進(jin)行(xing)聚(ju)合之后,需要(yao)開啟這(zhe)個(ge)字段(duan)的(de)(de)fielddata我,或(huo)者會出現(xian)如下錯誤:

Fielddata is disabled on text fields by default.

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

PUT /esdto/esdto/_mapping

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

pic
使用ElasticsearchTemplate對sex字段進行(xing)聚(ju)合

        // 創建一個查詢條件對象
        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);
        }
posted @ 2020-08-24 15:58  張占嶺  閱讀(6687)  評論(0)    收藏  舉報