当前位置:   article > 正文

ES查询 Java RestHighLevelClient API方法_resthighlevelclient.search() 怎么转换为对象

resthighlevelclient.search() 怎么转换为对象

    测试环境准备     查询所有文档           分页查询            关键字查询                 根据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.插入三条文档

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class TestSearch {
  4. @Autowired
  5. RestHighLevelClient client;
  6. @Autowired
  7. RestClient restClient;
  8. }

 查询所有文档

 1.构建 searchRequest 搜索请求对象                 2.设置请求对象的搜索对象的类型      

 3.构建搜索源对象searchSourceBuilder            4.设置搜索源对象的搜索方式                5.设置搜索源对象的过滤条件

 6.向搜索请求对象中设置 搜索源对象                   7.执行搜索,获得搜索结果对象searchResponse

  8.获得搜索结果数组  SearchHits [ ]

  1. @Test
  2. public void testSearchAll() throws Exception {
  3. //构建搜索请求对象
  4. SearchRequest searchRequest = new SearchRequest("xc_course");
  5. //设置搜索对象的类型
  6. searchRequest.types("doc");
  7. //构建搜索源对象
  8. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  9. //搜索源搜索方式
  10. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  11. //过滤条件 第一个要显示的字段,第二个不显示的
  12. searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
  13. //向搜索请求对象中设置搜索源
  14. searchRequest.source(searchSourceBuilder);
  15. //执行搜索,向ES发起Http请求,获得结果对象
  16. SearchResponse searchResponse = client.search(searchRequest);
  17. //搜索结果
  18. SearchHits hits = searchResponse.getHits();
  19. //获得匹配总记录
  20. long totalHits = hits.getTotalHits();
  21. //得到匹配度高的文档
  22. SearchHit[] searchHits = hits.getHits();
  23. //日期格式化对象
  24. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  25. for(SearchHit hit:searchHits){
  26. //文档的主键
  27. String id = hit.getId();
  28. //源文档内容
  29. Map<String, Object> sourceAsMap = hit.getSourceAsMap();
  30. String name = (String) sourceAsMap.get("name");
  31. //由于前边设置了源文档字段过虑,这时description是取不到的
  32. String description = (String) sourceAsMap.get("description");
  33. //学习模式
  34. String studymodel = (String) sourceAsMap.get("studymodel");
  35. //价格
  36. Double price = (Double) sourceAsMap.get("price");
  37. //日期
  38. Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
  39. System.out.println(name);
  40. System.out.println(studymodel);
  41. System.out.println(description);
  42. }
  43. }

分页查询

    只用在构建搜索源对象后设置参数   即可

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. int page = 1;
  3. //每页记录数
  4. int size = 1;
  5. //计算出记录起始下标
  6. int from = (page-1)*size;
  7. searchSourceBuilder.from(from);//起始记录下标,从0开始
  8. searchSourceBuilder.size(size);//每页显示的记录数
  9. //搜索源搜索方式
  10. searchSourceBuilder.query(QueryBuilders.matchAllQuery());

 关键字查询

  设置搜索源对象的查询方式为  termQuery("name","Spring")  表示查询字段为name的   关键字为Spring

  1. searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
  2. //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
  3. searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
  4. //向搜索请求对象中设置搜索源
  5. searchRequest.source(searchSourceBuilder);
  6. //执行搜索,向ES发起http请求
  7. SearchResponse searchResponse = client.search(searchRequest);
  8. //搜索结果
  9. SearchHits hits = searchResponse.getHits();
  10. //匹配到的总记录数
  11. long totalHits = hits.getTotalHits();
  12. //得到匹配度高的文档
  13. SearchHit[] searchHits = hits.getHits();

根据id查询

   可以根据多个id查询  所以searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));  中传入一个数组

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. //搜索方式 根据id查询
  3. String[] ids = new String[]{"1","2"};
  4. searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
  5. //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
  6. searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
  7. //向搜索请求对象中设置搜索源
  8. searchRequest.source(searchSourceBuilder);

matchQuery

   匹配查询   匹配字段 description     搜索关键字  spring 开发 框架会被分词为三个        

    minimumShouldMatch   为匹配度   0.8*3 =2.4 向下取整  2     所以在 description字段中只要有两个词就算匹配成功

    QueryBuilders.matchQuery("description","spring开发框架").minimumShouldMatch("80%")) 

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. //搜索方式MatchQuery
  3. searchSourceBuilder.query(QueryBuilders.matchQuery("description","spring开发框架")
  4. .minimumShouldMatch("80%"));
  5. //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
  6. searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
  7. //向搜索请求对象中设置搜索源
  8. searchRequest.source(searchSourceBuilder);

 multiMatchQuery

   匹配搜索多个字段

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

   设置搜索方式时,使用multiMatchQuery 第一个参数: 搜索的关键字      第二个参数可以为多个:   要搜索的字段(filed)

   使用minimumShouldMatch  设置匹配度   这里是只要有一个词就算

   field  提升name 字段的得分 权限       每个结果搜索出来后都会有一个得分   这里设置name属性 提升10倍的得分

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. //搜索方式
  3. //MultiMatchQuery
  4. searchSourceBuilder.query(QueryBuilders.multiMatchQuery("spring css","name","description")
  5. .minimumShouldMatch("50%")
  6. .field("name",10));
  7. //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
  8. searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
  9. //向搜索请求对象中设置搜索源
  10. searchRequest.source(searchSourceBuilder);

BoolQuery

   用于组合查询上述的查询方式

    1.定义一个  MultiMatchQueryBuilder      2.定一个  TermQueryBuilder             3.定一个BoolQueryBuilder

    4.使用 BoolQueryBuilder 将他们组合起来   

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

     5.将  BoolQueryBuilder  放入searchSourceBuilder() 设置查询方式

  1. @Test
  2. public void testBoolQuery() throws IOException, ParseException {
  3. //搜索请求对象
  4. SearchRequest searchRequest = new SearchRequest("xc_course");
  5. //指定类型
  6. searchRequest.types("doc");
  7. //搜索源构建对象
  8. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  9. //boolQuery搜索方式
  10. //先定义一个MultiMatchQuery
  11. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
  12. .minimumShouldMatch("50%")
  13. .field("name", 10);
  14. //再定义一个termQuery
  15. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");
  16. //定义一个boolQuery
  17. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  18. boolQueryBuilder.must(multiMatchQueryBuilder);
  19. boolQueryBuilder.must(termQueryBuilder);
  20. searchSourceBuilder.query(boolQueryBuilder);
  21. }

filter过滤器

   BoolQueryBuilder   不仅可以组合 普通的查询   还可以组合过滤器 性能更高   对查询出来的结果进行过滤

   boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));        表示  只需要 studymodel字段为  201001的
  boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));       表示过滤价格  大于等于90  小于等于100的

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. //boolQuery搜索方式 先定义一个MultiMatchQuery
  3. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
  4. .minimumShouldMatch("50%")
  5. .field("name", 10);
  6. //定义一个boolQuery
  7. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  8. boolQueryBuilder.must(multiMatchQueryBuilder);
  9. //定义过虑器
  10. boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));
  11. boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));
  12. searchSourceBuilder.query(boolQueryBuilder);

sort排序

 对查询后结果进行排序,  searchSourceBuilder 使用

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

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. //boolQuery搜索方式
  3. //定义一个boolQuery
  4. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  5. //定义过虑器
  6. boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
  7. searchSourceBuilder.query(boolQueryBuilder);
  8. //添加排序
  9. searchSourceBuilder.sort("studymodel", SortOrder.DESC);
  10. 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);

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. //boolQuery搜索方式先定义一个MultiMatchQuery
  3. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("开发框架", "name", "description")
  4. .minimumShouldMatch("50%")
  5. .field("name", 10);
  6. //定义一个boolQuery
  7. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  8. boolQueryBuilder.must(multiMatchQueryBuilder);
  9. //定义过虑器
  10. boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
  11. searchSourceBuilder.query(boolQueryBuilder);
  12. //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
  13. searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
  14. //设置高亮
  15. HighlightBuilder highlightBuilder = new HighlightBuilder();
  16. highlightBuilder.preTags("<tag>");
  17. highlightBuilder.postTags("</tag>");
  18. highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
  19. // highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
  20. searchSourceBuilder.highlighter(highlightBuilder);
  21. //向搜索请求对象中设置搜索源
  22. searchRequest.source(searchSourceBuilder);
  23. //执行搜索,向ES发起http请求
  24. SearchResponse searchResponse = client.search(searchRequest);

综合结构图

  1.  
  2. "_source" : [ "name""studymodel""description","price"], 
  3.    "query": { 
  4.  "bool" : { 
  5. "must":[  
  6.   { 
  7.     
  8. "multi_match" : { 
  9.              
  10. "query" : "开发框架"
  11.              
  12. "minimum_should_match""50%"
  13.              
  14. "fields": [ "name^10""description" ], 
  15.              
  16. "type":"best_fields" 
  17.  ], 
  18.  
  19. "filter": [  
  20.          
  21. "range": { "price": { "gte"0 ,"lte" : 100}}}  
  22. ]   
  23.  } 
  24.     }, 
  25.    "sort" : [ 
  26. "price" : "asc" 
  27.        } 
  28.      ], 
  29. "highlight": { 
  30.     "pre_tags": ["<tag1>"], 
  31.     "post_tags": ["</tag2>"],  
  32.     "fields": { 
  33.       "name": {}, 
  34.       "description":{} 
  35.     } 
  36.   } 
  37. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/68590
推荐阅读
相关标签
  

闽ICP备14008679号