Elasticsearch(七)使用java代码实现es 分页 高亮 排序 查询功能

朴灿烈づ我的快乐病毒、 2023-09-29 10:52 204阅读 0赞

在es api中我们可以看到,其查询条件主要封在QueryBuilder中;

分页、排序、字段过滤、高亮主要封装在SourceBuilder中;

测试代码如下:

  1. package com.xiaohui;
  2. import org.apache.http.HttpHost;
  3. import org.elasticsearch.action.search.MultiSearchRequest;
  4. import org.elasticsearch.action.search.MultiSearchResponse;
  5. import org.elasticsearch.action.search.SearchRequest;
  6. import org.elasticsearch.action.search.SearchResponse;
  7. import org.elasticsearch.client.RequestOptions;
  8. import org.elasticsearch.client.RestClient;
  9. import org.elasticsearch.client.RestHighLevelClient;
  10. import org.elasticsearch.common.text.Text;
  11. import org.elasticsearch.index.query.*;
  12. import org.elasticsearch.search.SearchHit;
  13. import org.elasticsearch.search.builder.SearchSourceBuilder;
  14. import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
  15. import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
  16. import org.elasticsearch.search.fetch.subphase.highlight.Highlighter;
  17. import org.elasticsearch.search.sort.SortOrder;
  18. import org.junit.jupiter.api.AfterEach;
  19. import org.junit.jupiter.api.BeforeEach;
  20. import org.junit.jupiter.api.Test;
  21. import java.io.IOException;
  22. import java.util.Map;
  23. public class ESTest3 {
  24. private RestHighLevelClient client;
  25. @BeforeEach
  26. public void getClient(){
  27. client = new RestHighLevelClient(
  28. RestClient.builder(
  29. new HttpHost("192.168.0.122", 9200, "http")));
  30. }
  31. @Test
  32. public void matchDoc(){
  33. QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
  34. commonSearch(queryBuilder);
  35. }
  36. @Test
  37. public void matchAllDoc(){
  38. QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
  39. commonSearch(queryBuilder);
  40. }
  41. /**
  42. * 含 分页 排序逻辑
  43. * @param queryBuilder
  44. */
  45. private void commonSearch(QueryBuilder queryBuilder) {
  46. //1,构建SearchRequest请求对象,指定索引库
  47. SearchRequest searchRequest = new SearchRequest("huizi");
  48. //2,构建SearchSourceBuilder查询对象
  49. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  50. //3,构建QueryBuilder对象指定查询方式和查询条件
  51. //4,将QuseryBuilder对象设置到SearchSourceBuilder对象中
  52. sourceBuilder.query(queryBuilder);
  53. //字段过滤
  54. sourceBuilder.fetchSource(new String[]{"title","price","band","category","id"},new String[]{"images"});
  55. //排序
  56. sourceBuilder.sort("price", SortOrder.DESC);
  57. //分页
  58. sourceBuilder.from(0);
  59. sourceBuilder.size(2);
  60. //5,将SearchSourceBuilder设置到SearchRequest中
  61. searchRequest.source(sourceBuilder);
  62. try {
  63. //6,调用方法查询数据
  64. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  65. //7,解析返回结果
  66. SearchHit[] hits = searchResponse.getHits().getHits();
  67. for (int i = 0; i < hits.length; i++) {
  68. System.out.println("返回的结果: " + hits[i].getSourceAsString());
  69. }
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. /**
  75. * 高亮的处理以及解析
  76. */
  77. @Test
  78. public void hightLight() {
  79. QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
  80. //1,构建SearchRequest请求对象,指定索引库
  81. SearchRequest searchRequest = new SearchRequest("huizi");
  82. //2,构建SearchSourceBuilder查询对象
  83. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  84. //高亮
  85. HighlightBuilder highlightBuilder = new HighlightBuilder();
  86. highlightBuilder.preTags("<front color='red'>");
  87. highlightBuilder.postTags("</front>");
  88. highlightBuilder.field("title");
  89. sourceBuilder.highlighter(highlightBuilder);
  90. //4,将QuseryBuilder对象设置到SearchSourceBuilder对象中
  91. sourceBuilder.query(queryBuilder);
  92. //5,将SearchSourceBuilder设置到SearchRequest中
  93. searchRequest.source(sourceBuilder);
  94. try {
  95. //6,调用方法查询数据
  96. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  97. //7,解析返回结果
  98. SearchHit[] hits = searchResponse.getHits().getHits();
  99. for (int i = 0; i < hits.length; i++) {
  100. SearchHit hit = hits[i];
  101. System.out.println("返回的结果: " + hit.getSourceAsString());
  102. Map<String, HighlightField> highlightFields = hit.getHighlightFields();
  103. HighlightField highlightField = highlightFields.get("title");
  104. Text[] fragments = highlightField.getFragments();
  105. for (Text fragment : fragments) {
  106. System.out.println("高亮的信息: "+fragment);
  107. }
  108. }
  109. } catch (IOException e) {
  110. e.printStackTrace();
  111. }
  112. }
  113. //多索引查询
  114. @Test
  115. public void mulitIndexSearch(){
  116. SearchRequest searchRequest = new SearchRequest(new String[]{"huizi","huizi2"});
  117. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  118. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "手机");
  119. matchQueryBuilder.minimumShouldMatch("80%");
  120. sourceBuilder.query(matchQueryBuilder);
  121. searchRequest.source(sourceBuilder);
  122. try {
  123. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  124. //7,解析返回结果
  125. SearchHit[] hits = searchResponse.getHits().getHits();
  126. for (int i = 0; i < hits.length; i++) {
  127. System.out.println("返回的结果: " + hits[i].getSourceAsString());
  128. }
  129. } catch (IOException e) {
  130. e.printStackTrace();
  131. }
  132. }
  133. /**
  134. * 批量查询
  135. */
  136. @Test
  137. public void mulitIndexSearch2(){
  138. MultiSearchRequest request = new MultiSearchRequest();
  139. SearchRequest firstSearchRequest = new SearchRequest(new String[]{"huizi","huizi2"});
  140. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  141. searchSourceBuilder.query(QueryBuilders.matchQuery("title", "小米"));
  142. firstSearchRequest.source(searchSourceBuilder);
  143. request.add(firstSearchRequest);
  144. SearchRequest secondSearchRequest = new SearchRequest(new String[]{"huizi","huizi2"});
  145. searchSourceBuilder = new SearchSourceBuilder();
  146. searchSourceBuilder.query(QueryBuilders.matchQuery("band", "大米"));
  147. secondSearchRequest.source(searchSourceBuilder);
  148. request.add(secondSearchRequest);
  149. try {
  150. MultiSearchResponse multiSearchResponse = client.msearch(request, RequestOptions.DEFAULT);
  151. MultiSearchResponse.Item[] responses = multiSearchResponse.getResponses();
  152. for (MultiSearchResponse.Item respons : responses) {
  153. SearchHit[] hits = respons.getResponse().getHits().getHits();
  154. for (int i = 0; i < hits.length; i++) {
  155. System.out.println("返回的结果: " + hits[i].getSourceAsString());
  156. }
  157. }
  158. } catch (IOException e) {
  159. e.printStackTrace();
  160. }
  161. }
  162. /**
  163. * 布尔组合查询
  164. */
  165. @Test
  166. public void mulitIndexSearch3(){
  167. SearchRequest searchRequest = new SearchRequest("huizi");
  168. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  169. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  170. //名字-小米
  171. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "小米").minimumShouldMatch("80%");
  172. //品牌-小米
  173. MatchQueryBuilder matchQueryBuilder2 = QueryBuilders.matchQuery("band", "小米").operator(Operator.AND);
  174. //分类-化妆品
  175. MatchQueryBuilder matchQueryBuilder3 = QueryBuilders.matchQuery("category", "化妆品");
  176. //图片路径- jjj模糊
  177. FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("title", "小米");
  178. //价格 必须 2699
  179. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("price", "2699");
  180. boolQueryBuilder.must(matchQueryBuilder);//必须
  181. boolQueryBuilder.must(termQueryBuilder);//必须
  182. // boolQueryBuilder.mustNot(matchQueryBuilder2);//不能
  183. boolQueryBuilder.should(matchQueryBuilder3);//可以
  184. // boolQueryBuilder.filter(fuzzyQueryBuilder);//结果中过滤
  185. sourceBuilder.query(boolQueryBuilder);
  186. searchRequest.source(sourceBuilder);
  187. try {
  188. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  189. SearchHit[] hits = searchResponse.getHits().getHits();
  190. for (int i = 0; i < hits.length; i++) {
  191. System.out.println("返回的结果: " + hits[i].getSourceAsString());
  192. }
  193. } catch (IOException e) {
  194. e.printStackTrace();
  195. }
  196. }
  197. @AfterEach
  198. public void close(){
  199. if(null!= client){
  200. try {
  201. client.close();
  202. } catch (IOException e) {
  203. e.printStackTrace();
  204. }
  205. }
  206. }
  207. }

发表评论

表情:
评论列表 (有 0 条评论,204人围观)

还没有评论,来说两句吧...

相关阅读