ES查詢 Java RestHighLevelClient API方法

    測試環境準備     查詢所有文檔           分頁查詢            關鍵字查詢                 根據id查詢

    matchQuery      multiMatchQuery     BoolQuery     filter過濾器                     sort排序     高亮 

took:本次操作花費的時間,單位爲毫秒。     timed_out:請求是否超時       _shards:說明本次操作共搜索了哪些分片
hits:搜索命中的記錄       hits.total : 符合條件的文檔總數 hits.hits :匹配度較高的前N個文檔
hits.max_score:文檔匹配得分,這裏爲最高分    _score:每個文檔都有一個匹配度得分,按照降序排列。
_source:顯示了文檔的原始內容。

測試環境準備

 1.創建xc_course 索引庫       2.創建映射配置    3.插入三條文檔

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestSearch {
    @Autowired
    RestHighLevelClient client;
    @Autowired
    RestClient restClient;
}

 查詢所有文檔

 1.構建 searchRequest 搜索請求對象                 2.設置請求對象的搜索對象的類型      

 3.構建搜索源對象searchSourceBuilder            4.設置搜索源對象的搜索方式                5.設置搜索源對象的過濾條件

 6.向搜索請求對象中設置 搜索源對象                   7.執行搜索,獲得搜索結果對象searchResponse

  8.獲得搜索結果數組  SearchHits [ ]

     @Test
    public void testSearchAll() throws Exception {
        //構建搜索請求對象
        SearchRequest searchRequest = new SearchRequest("xc_course");
        //設置搜索對象的類型
        searchRequest.types("doc");
        //構建搜索源對象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索源搜索方式
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //過濾條件 第一個要顯示的字段,第二個不顯示的
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索請求對象中設置搜索源
        searchRequest.source(searchSourceBuilder);
        //執行搜索,向ES發起Http請求,獲得結果對象
        SearchResponse searchResponse = client.search(searchRequest);
        //搜索結果
        SearchHits hits = searchResponse.getHits();
        //獲得匹配總記錄
        long totalHits = hits.getTotalHits();
        //得到匹配度高的文檔
        SearchHit[] searchHits = hits.getHits();
        //日期格式化對象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文檔的主鍵
            String id = hit.getId();
            //源文檔內容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由於前邊設置了源文檔字段過慮,這時description是取不到的
            String description = (String) sourceAsMap.get("description");
            //學習模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //價格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }

    }

分頁查詢

    只用在構建搜索源對象後設置參數   即可

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        int page = 1;
        //每頁記錄數
        int size = 1;
        //計算出記錄起始下標
        int from  = (page-1)*size;
        searchSourceBuilder.from(from);//起始記錄下標,從0開始
        searchSourceBuilder.size(size);//每頁顯示的記錄數
        //搜索源搜索方式
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

 關鍵字查詢

  設置搜索源對象的查詢方式爲  termQuery("name","Spring")  表示查詢字段爲name的   關鍵字爲Spring

        searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
        //設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索請求對象中設置搜索源
        searchRequest.source(searchSourceBuilder);
        //執行搜索,向ES發起http請求
        SearchResponse searchResponse = client.search(searchRequest);
        //搜索結果
        SearchHits hits = searchResponse.getHits();
        //匹配到的總記錄數
        long totalHits = hits.getTotalHits();
        //得到匹配度高的文檔
        SearchHit[] searchHits = hits.getHits();

根據id查詢

   可以根據多個id查詢  所以searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));  中傳入一個數組

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索方式  根據id查詢
        String[] ids = new String[]{"1","2"};
        searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
        //設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索請求對象中設置搜索源
        searchRequest.source(searchSourceBuilder);

matchQuery

   匹配查詢   匹配字段 description     搜索關鍵字  spring 開發 框架會被分詞爲三個        

    minimumShouldMatch   爲匹配度   0.8*3 =2.4 向下取整  2     所以在 description字段中只要有兩個詞就算匹配成功

    QueryBuilders.matchQuery("description","spring開發框架").minimumShouldMatch("80%")) 

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索方式MatchQuery
        searchSourceBuilder.query(QueryBuilders.matchQuery("description","spring開發框架")
                .minimumShouldMatch("80%"));
        //設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索請求對象中設置搜索源
        searchRequest.source(searchSourceBuilder);

 multiMatchQuery

   匹配搜索多個字段

   QueryBuilders.multiMatchQuery("spring css","name","description")  .minimumShouldMatch("50%") .field("name",10)

   設置搜索方式時,使用multiMatchQuery 第一個參數: 搜索的關鍵字      第二個參數可以爲多個:   要搜索的字段(filed)

   使用minimumShouldMatch  設置匹配度   這裏是只要有一個詞就算

   field  提升name 字段的得分 權限       每個結果搜索出來後都會有一個得分   這裏設置name屬性 提升10倍的得分

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索方式
        //MultiMatchQuery
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("spring css","name","description")
                .minimumShouldMatch("50%")
                .field("name",10));
        //設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索請求對象中設置搜索源
        searchRequest.source(searchSourceBuilder);

BoolQuery

   用於組合查詢上述的查詢方式

    1.定義一個  MultiMatchQueryBuilder      2.定一個  TermQueryBuilder             3.定一個BoolQueryBuilder

    4.使用 BoolQueryBuilder 將他們組合起來   

      boolQueryBuilder.must(multiMatchQueryBuilder);     boolQueryBuilder.must(termQueryBuilder);

     5.將  BoolQueryBuilder  放入searchSourceBuilder() 設置查詢方式

    @Test
    public void testBoolQuery() throws IOException, ParseException {
        //搜索請求對象
        SearchRequest searchRequest = new SearchRequest("xc_course");
        //指定類型
        searchRequest.types("doc");
        //搜索源構建對象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //boolQuery搜索方式
        //先定義一個MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);
        //再定義一個termQuery
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");

        //定義一個boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.must(termQueryBuilder);

        searchSourceBuilder.query(boolQueryBuilder);
    }

filter過濾器

   BoolQueryBuilder   不僅可以組合 普通的查詢   還可以組合過濾器 性能更高   對查詢出來的結果進行過濾

   boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));        表示  只需要 studymodel字段爲  201001的
  boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));       表示過濾價格  大於等於90  小於等於100的

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //boolQuery搜索方式  先定義一個MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);

        //定義一個boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        //定義過慮器
        boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));

        searchSourceBuilder.query(boolQueryBuilder);

sort排序

 對查詢後結果進行排序,  searchSourceBuilder 使用

   searchSourceBuilder.sort("studymodel", SortOrder.DESC);
   searchSourceBuilder.sort("price", SortOrder.ASC);

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //boolQuery搜索方式
        //定義一個boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //定義過慮器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));

        searchSourceBuilder.query(boolQueryBuilder);
        //添加排序
        searchSourceBuilder.sort("studymodel", SortOrder.DESC);
        searchSourceBuilder.sort("price", SortOrder.ASC);

  高亮 

  1. 定義高亮對象  HighlightBuilder( )

   2.在關鍵字前,後  設置標籤 highlightBuilder.preTags("<span style="color="red">");                                                                                                           highlightBuilder.postTags("<span style="color="red">");

   3.設置需要高亮的字段   highlightBuilder.fields().add(new HighlightBuilder.Field("name"));

  4.設置源數據 高亮   searchSourceBuilder.highlighter(highlightBuilder);

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //boolQuery搜索方式先定義一個MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("開發框架", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);

        //定義一個boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        //定義過慮器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));

        searchSourceBuilder.query(boolQueryBuilder);
        //設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});

        //設置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<tag>");
        highlightBuilder.postTags("</tag>");
        highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
//        highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
        searchSourceBuilder.highlighter(highlightBuilder);

        //向搜索請求對象中設置搜索源
        searchRequest.source(searchSourceBuilder);
        //執行搜索,向ES發起http請求
        SearchResponse searchResponse = client.search(searchRequest);

綜合結構圖

{ 
 
"_source" : [ "name", "studymodel", "description","price"], 
   "query": { 
 "bool" : { 
     "must":[  
         { 
    
        "multi_match" : { 
             
    "query" : "開發框架", 
                 
    "minimum_should_match": "50%", 
             
    "fields": [ "name^10", "description" ], 
             
    "type":"best_fields" 
    } 
    } 
             ], 
 
    "filter": [  
         
    { "range": { "price": { "gte": 0 ,"lte" : 100}}}  
        ]   
 } 
    }, 
   "sort" : [ 
        { 
        "price" : "asc" 
          } 
            ], 

"highlight": { 
    "pre_tags": ["<tag1>"], 
    "post_tags": ["</tag2>"],  
    "fields": { 
      "name": {}, 
      "description":{} 
    } 
  } 
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章