• 记录贴 Elasticsearch的RestClient进行DSL查询


    • must:必须匹配每个子查询,类似“与”

    • should:选择性匹配子查询,类似“或”

    • must_not:必须不匹配,不参与算分,类似“非”

    • filter:必须匹配,不参与算分

    1. import cn.hutool.json.JSONUtil;
    2. import com.hmall.item.domain.po.ItemDoc;
    3. import com.hmall.item.service.IItemService;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.apache.http.HttpHost;
    6. import org.elasticsearch.action.search.SearchRequest;
    7. import org.elasticsearch.action.search.SearchResponse;
    8. import org.elasticsearch.client.RequestOptions;
    9. import org.elasticsearch.client.RestClient;
    10. import org.elasticsearch.client.RestHighLevelClient;
    11. import org.elasticsearch.index.query.QueryBuilders;
    12. import org.elasticsearch.search.SearchHit;
    13. import org.elasticsearch.search.SearchHits;
    14. import org.junit.jupiter.api.AfterEach;
    15. import org.junit.jupiter.api.BeforeEach;
    16. import org.junit.jupiter.api.Test;
    17. import org.springframework.beans.factory.annotation.Autowired;
    18. import org.springframework.boot.test.context.SpringBootTest;
    19. import java.io.IOException;
    20. @Slf4j
    21. @SpringBootTest(properties = "spring.profiles.active=local")
    22. public class ElassticSearchTest {
    23. private RestHighLevelClient client;
    24. @Autowired
    25. private IItemService itemService;
    26. @BeforeEach
    27. void setUp() {
    28. this.client = new RestHighLevelClient(RestClient.builder(
    29. HttpHost.create("http://192.168.48.129:9200")
    30. ));
    31. }
    32. @AfterEach
    33. void tearDown() throws IOException {
    34. this.client.close();
    35. }
    36. @Test
    37. void testMatchAll() throws IOException {
    38. // 1.创建Request
    39. SearchRequest request = new SearchRequest("items");
    40. // 2.组织请求参数
    41. request.source().query(QueryBuilders.matchAllQuery());
    42. // 3.发送请求
    43. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    44. // 4.解析响应
    45. handleResponse(response);
    46. }
    47. private void handleResponse(SearchResponse response) {
    48. SearchHits searchHits = response.getHits();
    49. // 1.获取总条数
    50. long total = searchHits.getTotalHits().value;
    51. System.out.println("共搜索到" + total + "条数据");
    52. // 2.遍历结果数组
    53. SearchHit[] hits = searchHits.getHits();
    54. for (SearchHit hit : hits) {
    55. // 3.得到_source,也就是原始json文档
    56. String source = hit.getSourceAsString();
    57. // 4.反序列化并打印
    58. ItemDoc item = JSONUtil.toBean(source, ItemDoc.class);
    59. // 5.1处理高亮
    60. Map hfs = hit.getHighlightFields();
    61. // 5.2判断是否有高亮
    62. if(hfs != null && !hfs.isEmpty()){
    63. // 5.3获取高亮
    64. HighlightField hf = hfs.get("name");
    65. // 5.4获取高亮内容
    66. String hfName = hf.getFragments()[0].string();
    67. item.setName(hfName);
    68. }
    69. System.out.println(item);
    70. }
    71. }
    72. @Test
    73. void testMatch() throws IOException {
    74. // 1.创建Request
    75. SearchRequest request = new SearchRequest("items");
    76. // 2.组织请求参数
    77. request.source().query(QueryBuilders.matchQuery("name", "脱脂牛奶"));
    78. // 3.发送请求
    79. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    80. // 4.解析响应
    81. handleResponse(response);
    82. }
    83. @Test
    84. void testMultiMatch() throws IOException {
    85. // 1.创建Request
    86. SearchRequest request = new SearchRequest("items");
    87. // 2.组织请求参数
    88. request.source().query(QueryBuilders.multiMatchQuery("脱脂牛奶", "name", "category"));
    89. // 3.发送请求
    90. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    91. // 4.解析响应
    92. handleResponse(response);
    93. }
    94. @Test
    95. void testRange() throws IOException {
    96. // 1.创建Request
    97. SearchRequest request = new SearchRequest("items");
    98. // 2.组织请求参数
    99. request.source().query(QueryBuilders.rangeQuery("price").gte(10000).lte(30000));
    100. // 3.发送请求
    101. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    102. // 4.解析响应
    103. handleResponse(response);
    104. }
    105. @Test
    106. void testTerm() throws IOException {
    107. // 1.创建Request
    108. SearchRequest request = new SearchRequest("items");
    109. // 2.组织请求参数
    110. request.source().query(QueryBuilders.termQuery("brand", "华为"));
    111. // 3.发送请求
    112. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    113. // 4.解析响应
    114. handleResponse(response);
    115. }
    116. @Test
    117. void testBool() throws IOException {
    118. // 1.创建Request
    119. SearchRequest request = new SearchRequest("items");
    120. // 2.组织请求参数
    121. // 2.1.准备bool查询
    122. BoolQueryBuilder bool = QueryBuilders.boolQuery();
    123. // 2.2.关键字搜索
    124. bool.must(QueryBuilders.matchQuery("name", "脱脂牛奶"));
    125. // 2.3.品牌过滤
    126. bool.filter(QueryBuilders.termQuery("brand", "德亚"));
    127. // 2.4.价格过滤
    128. bool.filter(QueryBuilders.rangeQuery("price").lte(30000));
    129. request.source().query(bool);
    130. // 3.发送请求
    131. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    132. // 4.解析响应
    133. handleResponse(response);
    134. }
    135. @Test
    136. void testPageAndSort() throws IOException {
    137. int pageNo = 1, pageSize = 5;
    138. // 1.创建Request
    139. SearchRequest request = new SearchRequest("items");
    140. // 2.组织请求参数
    141. // 2.1.搜索条件参数
    142. request.source().query(QueryBuilders.matchQuery("name", "脱脂牛奶"));
    143. // 2.2.排序参数
    144. request.source().sort("price", SortOrder.ASC);
    145. // 2.3.分页参数
    146. request.source().from((pageNo - 1) * pageSize).size(pageSize);
    147. // 3.发送请求
    148. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    149. // 4.解析响应
    150. handleResponse(response);
    151. }
    152. @Test
    153. void testHighlight() throws IOException {
    154. // 1.创建Request
    155. SearchRequest request = new SearchRequest("items");
    156. // 2.组织请求参数
    157. // 2.1.query条件
    158. request.source().query(QueryBuilders.matchQuery("name", "脱脂牛奶"));
    159. // 2.2.高亮条件
    160. request.source().highlighter(
    161. SearchSourceBuilder.highlight()
    162. .field("name")
    163. .preTags("")
    164. .postTags("")
    165. );
    166. // 3.发送请求
    167. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    168. // 4.解析响应
    169. handleResponse(response);
    170. }
    171. //聚合
    172. @Test
    173. void testAgg() throws IOException {
    174. // 1.创建Request
    175. SearchRequest request = new SearchRequest("items");
    176. // 2.准备请求参数
    177. BoolQueryBuilder bool = QueryBuilders.boolQuery()
    178. .filter(QueryBuilders.termQuery("category", "手机"))
    179. .filter(QueryBuilders.rangeQuery("price").gte(300000));
    180. request.source().query(bool).size(0);
    181. // 3.聚合参数
    182. request.source().aggregation(
    183. AggregationBuilders.terms("brand_agg").field("brand").size(5)
    184. );
    185. // 4.发送请求
    186. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    187. // 5.解析聚合结果
    188. Aggregations aggregations = response.getAggregations();
    189. // 5.1.获取品牌聚合
    190. Terms brandTerms = aggregations.get("brand_agg");
    191. // 5.2.获取聚合中的桶
    192. Listextends Terms.Bucket> buckets = brandTerms.getBuckets();
    193. // 5.3.遍历桶内数据
    194. for (Terms.Bucket bucket : buckets) {
    195. // 5.4.获取桶内key
    196. String brand = bucket.getKeyAsString();
    197. System.out.print("brand = " + brand);
    198. long count = bucket.getDocCount();
    199. System.out.println("; count = " + count);
    200. }
    201. }
    202. }

  • 相关阅读:
    20 Python的time模块
    Axure RP暗黑色高保真中后台原型组件模板库及组件库素材
    什么是RPA机器人流程自动化软件?
    C++初阶学习第二弹——C++入门(下)
    “智慧时代的引领者:探索人工智能的无限可能性“
    网络安全市场投资融资趋势报告
    android13(T) SystemUI 运营商显示 bug 修复
    查找xml文件
    Redis数据结构之跳表
    【C++语法讲解】 | 运算符重构 | 三种运算符的重构方式 |代码演示
  • 原文地址:https://blog.csdn.net/qq_65252348/article/details/139300140