springboot 使用 Spring Data Elasticsearch 高级查询文档

上接:springboot 使用 Spring Data Elasticsearch 操作 Elasticsearch 7.9-创建工程

查询操作

service类

  1. package day1.service;
  2. import day1.entity.Toutiao;
  3. import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction;
  4. import org.elasticsearch.index.query.*;
  5. import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
  6. import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
  7. import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
  8. import org.elasticsearch.search.aggregations.AggregationBuilders;
  9. import org.elasticsearch.search.aggregations.Aggregations;
  10. import org.elasticsearch.search.aggregations.metrics.MaxAggregationBuilder;
  11. import org.elasticsearch.search.aggregations.metrics.ParsedMax;
  12. import org.elasticsearch.search.sort.SortBuilder;
  13. import org.elasticsearch.search.sort.SortBuilders;
  14. import org.elasticsearch.search.sort.SortOrder;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.data.domain.PageRequest;
  17. import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
  18. import org.springframework.data.elasticsearch.core.SearchHits;
  19. import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
  20. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
  21. import org.springframework.data.elasticsearch.core.query.Query;
  22. import org.springframework.stereotype.Service;
  23. @Service
  24. public class ESToutiaoSearchSrvImpl {
  25. @Autowired
  26. private ElasticsearchRestTemplate temp;
  27. /**
  28. * 短语查询
  29. *
  30. * @return
  31. */
  32. public SearchHits<Toutiao> matchPhraseQuery(String keyword) {
  33. //1.查询title中含有 keyword 的内容的记录
  34. MatchPhraseQueryBuilder builder = QueryBuilders.matchPhraseQuery("title", keyword);
  35. //2.构建查询
  36. NativeSearchQuery query=new NativeSearchQueryBuilder()
  37. .withQuery(builder)
  38. .build();
  39. //3.执行查询
  40. SearchHits<Toutiao> shs = temp.search(query,Toutiao.class);
  41. return shs;
  42. }
  43. /**
  44. * 通配符查询,使用keyword类型,区分大小写。按照like排序,且分页
  45. *
  46. * @return
  47. */
  48. public SearchHits<Toutiao> wildcardQuery(String keyword, Integer pageNum, Integer pageSize){
  49. if(pageNum==null){
  50. pageNum=1;
  51. }
  52. // 关键字查询
  53. QueryBuilder wildcard=QueryBuilders.wildcardQuery("title.keyword",keyword);
  54. //设置查询分页,从第一页开始,一页显示10条,从0开始
  55. PageRequest page = PageRequest.of(pageNum, pageSize);
  56. //按照点赞数量降序排序
  57. SortBuilder sort=SortBuilders.fieldSort("like").order(SortOrder.DESC);
  58. NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
  59. .withQuery(wildcard)
  60. .withPageable(page)
  61. .withSort(sort)
  62. .build();
  63. SearchHits<Toutiao> shs=temp.search(nativeSearchQuery,Toutiao.class);
  64. return shs;
  65. }
  66. /**
  67. * 全文索引查询
  68. *
  69. * @return
  70. */
  71. public SearchHits<Toutiao> match(String text, Integer pageNum, Integer pageSize){
  72. //match查询
  73. QueryBuilder match=QueryBuilders.matchQuery("title",text);
  74. //设置查询分页,从第一页开始,一页显示10条,从0开始
  75. PageRequest page=PageRequest.of(pageNum,pageSize);
  76. //按照点赞数量降序排序
  77. SortBuilder sort=SortBuilders.fieldSort("like").order(SortOrder.DESC);
  78. NativeSearchQuery query = new NativeSearchQueryBuilder()
  79. .withQuery(match)
  80. .withPageable(page)
  81. .withSort(sort)
  82. .build();
  83. SearchHits<Toutiao> shs=temp.search(query,Toutiao.class);
  84. return shs;
  85. }
  86. /**
  87. * bool 查询
  88. *
  89. * @return
  90. */
  91. public SearchHits<Toutiao> boolQuery(String title, String content, Integer pageNum, Integer pageSize) {
  92. //1.创建QueryBuilder(即设置查询条件)这儿创建的是组合查询(也叫多条件查询),后面会介绍更多的查询方法
  93. /*组合查询BoolQueryBuilder
  94. * must(QueryBuilders) :AND
  95. * mustNot(QueryBuilders):NOT
  96. * should: :OR
  97. */
  98. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  99. //查询标题中必须有 入门,内容必须有 技巧
  100. boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("title",title));
  101. boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("content",content));
  102. //设置查询分页,从第一页开始,一页显示10条,从0开始
  103. PageRequest page = PageRequest.of(pageNum, pageSize);
  104. //按照点赞数量降序排序
  105. SortBuilder sort= SortBuilders.fieldSort("like").order(SortOrder.DESC);
  106. //2.构建查询
  107. NativeSearchQuery query=new NativeSearchQueryBuilder()
  108. .withQuery(boolQueryBuilder)
  109. .withPageable(page)
  110. .withSort(sort)
  111. .build();
  112. //3.执行查询
  113. SearchHits<Toutiao> shs = temp.search(query,Toutiao.class);
  114. return shs;
  115. }
  116. /**
  117. * 范围查询
  118. *
  119. * @return
  120. */
  121. public SearchHits<Toutiao> range(String text, int from, int to, Integer pageNum, Integer pageSize){
  122. QueryBuilder match=QueryBuilders.matchQuery("content",text);
  123. QueryBuilder range=QueryBuilders.rangeQuery("like").gt(from).lte(to);
  124. BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
  125. boolQueryBuilder.must(match);
  126. boolQueryBuilder.filter(range);
  127. //设置查询分页,从第一页开始,一页显示10条,从0开始
  128. PageRequest page=PageRequest.of(pageNum,pageSize);
  129. //按照点赞数量降序排序
  130. SortBuilder sort=SortBuilders.fieldSort("like").order(SortOrder.DESC);
  131. NativeSearchQuery query = new NativeSearchQueryBuilder()
  132. .withQuery(boolQueryBuilder)
  133. .withPageable(page)
  134. .withSort(sort)
  135. .build();
  136. SearchHits<Toutiao> shs=temp.search(query,Toutiao.class);
  137. return shs;
  138. }
  139. public double maxLike(){
  140. MaxAggregationBuilder max= AggregationBuilders
  141. .max("max_like")
  142. .field("like");
  143. PageRequest page=PageRequest.of(0,1);
  144. NativeSearchQuery query = new NativeSearchQueryBuilder()
  145. .addAggregation(max)
  146. .withPageable(page)
  147. .build();
  148. SearchHits<Toutiao> shs=temp.search(query,Toutiao.class);
  149. Aggregations aggregations = shs.getAggregations();
  150. ParsedMax agg=aggregations.get("max_like");
  151. double val=agg.getValue();
  152. return val;
  153. }
  154. /*
  155. 二次评分
  156. */
  157. public SearchHits<Toutiao> functionScore(String text, Integer pageNum, Integer pageSize){
  158. MatchQueryBuilder mqb=QueryBuilders.matchQuery("title", text);
  159. FieldValueFactorFunctionBuilder fffb=ScoreFunctionBuilders
  160. .fieldValueFactorFunction("like")
  161. .modifier(FieldValueFactorFunction.Modifier.LOG1P);
  162. // 分数,并自动按分排序(对单个属性进行查询)
  163. FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.
  164. functionScoreQuery(mqb,fffb);
  165. PageRequest page=PageRequest.of(pageNum,pageSize);
  166. Query query = new NativeSearchQueryBuilder()
  167. .withQuery(functionScoreQueryBuilder)
  168. .withPageable(page)
  169. .build();
  170. SearchHits<Toutiao> shs = temp.search(query, Toutiao.class);
  171. return shs;
  172. }
  173. }

测试类

  1. package test;
  2. import day1.Main;
  3. import day1.entity.Toutiao;
  4. import day1.service.ESToutiaoSearchSrvImpl;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import org.springframework.data.elasticsearch.core.SearchHit;
  10. import org.springframework.data.elasticsearch.core.SearchHits;
  11. import org.springframework.test.context.junit4.SpringRunner;
  12. import java.util.List;
  13. @RunWith(SpringRunner.class)
  14. @SpringBootTest(classes = Main.class)
  15. public class TestESToutiaoSearchSrvImpl {
  16. @Autowired
  17. private ESToutiaoSearchSrvImpl service;
  18. @Test
  19. public void matchPhraseQuery(){
  20. SearchHits<Toutiao> shs = service.matchPhraseQuery("mysql java");
  21. //4.获取总条数(用于前端分页)
  22. System.out.println("共:"+shs.getTotalHits()+" 条记录!");
  23. //5.获取查询到的数据内容(返回给前端)
  24. for (SearchHit<Toutiao> item : shs) {
  25. Toutiao toutiao=item.getContent();
  26. System.out.println(toutiao);
  27. }
  28. }
  29. @Test
  30. public void wildcardQuery(){
  31. // 查询 title是java 开头记录
  32. SearchHits<Toutiao> shs = service.wildcardQuery("java*", 0, 5);
  33. System.out.println("共:"+shs.getTotalHits()+" 条记录!");
  34. for(SearchHit<Toutiao> item : shs){
  35. Toutiao toutiao=item.getContent();
  36. System.out.println(toutiao);
  37. }
  38. }
  39. @Test
  40. public void match(){
  41. SearchHits<Toutiao> shs = service.match("java mysql",1,5);
  42. for(SearchHit<Toutiao> item : shs){
  43. Toutiao toutiao=item.getContent();
  44. System.out.println(toutiao);
  45. }
  46. }
  47. @Test
  48. public void boolQuery(){
  49. SearchHits<Toutiao> shs = service.boolQuery("入门", "技巧", 0, 5);
  50. //4.获取总条数(用于前端分页)
  51. System.out.println("共:"+shs.getTotalHits()+" 条记录!");
  52. //5.获取查询到的数据内容(返回给前端)
  53. for (SearchHit<Toutiao> item : shs) {
  54. Toutiao toutiao=item.getContent();
  55. System.out.println(toutiao);
  56. }
  57. }
  58. @Test
  59. public void range(){
  60. SearchHits<Toutiao> shs = service.range("java", 229, 983, 0, 5);
  61. //4.获取总条数(用于前端分页)
  62. System.out.println("共:"+shs.getTotalHits()+" 条记录!");
  63. for(SearchHit<Toutiao> item : shs){
  64. Toutiao toutiao=item.getContent();
  65. System.out.println(toutiao);
  66. }
  67. }
  68. @Test
  69. public void maxLike(){
  70. double val = service.maxLike();
  71. System.out.println(val);
  72. }
  73. @Test
  74. public void functionScore(){
  75. SearchHits<Toutiao> shs = service.functionScore("java", 0, 5);
  76. List<SearchHit<Toutiao>> list=shs.getSearchHits();
  77. for(SearchHit<Toutiao> item:list){
  78. Toutiao toutiao=item.getContent();
  79. System.out.println("score:"+item.getScore()+"--"+toutiao);
  80. }
  81. }
  82. }

原文出处:http://malaoshi.top/show_1IX1tOTe226Q.html