• 【ES常用查询】基于ElasticsearchRestTemplate及NativeSearchQuery的查询


    包含当前es所有的查询,

    需要什么代码直接照搬,改个参数就行!

    用的好请务必给我点赞!!!感谢爱你们!!!

    (周末更  筒)

    为啥写这篇文章呢:

    大概是因为目前公司用的api跟以前的不太一样,

    以前我们是基于高标准客户端直接做的,

    但是目前这边同事是基于ElasticsearchRestTemplate跟NativeSearchQuery做的。

    1. import lombok.extern.slf4j.Slf4j;
    2. import org.elasticsearch.common.lucene.search.function.CombineFunction;
    3. import org.elasticsearch.index.query.BoolQueryBuilder;
    4. import org.elasticsearch.index.query.MatchAllQueryBuilder;
    5. import org.elasticsearch.index.query.MatchQueryBuilder;
    6. import org.elasticsearch.index.query.MultiMatchQueryBuilder;
    7. import org.elasticsearch.index.query.QueryBuilders;
    8. import org.elasticsearch.index.query.RangeQueryBuilder;
    9. import org.elasticsearch.index.query.TermsQueryBuilder;
    10. import org.elasticsearch.index.query.WildcardQueryBuilder;
    11. import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
    12. import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder;
    13. import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
    14. import org.elasticsearch.search.builder.SearchSourceBuilder;
    15. import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
    16. import org.elasticsearch.search.sort.SortBuilder;
    17. import org.elasticsearch.search.sort.SortBuilders;
    18. import org.elasticsearch.search.sort.SortOrder;
    19. import org.springframework.beans.factory.annotation.Autowired;
    20. import org.springframework.data.domain.PageRequest;
    21. import org.springframework.data.domain.Pageable;
    22. import org.springframework.data.domain.Sort;
    23. import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
    24. import org.springframework.data.elasticsearch.core.SearchHit;
    25. import org.springframework.data.elasticsearch.core.SearchHits;
    26. import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
    27. import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
    28. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
    29. import org.springframework.web.bind.annotation.PostMapping;
    30. import org.springframework.web.bind.annotation.RequestMapping;
    31. import org.springframework.web.bind.annotation.RestController;
    32. import java.util.List;
    33. import java.util.Map;
    34. @Slf4j
    35. @RestController
    36. @RequestMapping("/v/k/t/query")
    37. public class EsTestController {
    38. /**
    39. * 测试es各种查询方法*
    40. */
    41. @Autowired
    42. ElasticsearchRestTemplate elasticsearchRestTemplate;
    43. //通配符查询
    44. @PostMapping("/es/wildcard")
    45. public void wildcard() {
    46. //*:匹配任意数量的字符(包括零个字符)。 *x*: 对x做前后N位做模糊查询,前后有多少值都可以查到(也可以左模糊或者右模糊)
    47. //?:用于匹配单个字符. user?a: user?a 匹配user1a,但不匹配user123a
    48. //^:必须以某个字符开头,如^user*:必须以user开头
    49. //$:必须以某个字符结尾,如user$:必须以user结尾
    50. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    51. //wildcardQuery:通配符查询
    52. WildcardQueryBuilder bsVersion = QueryBuilders.wildcardQuery("bsVersion", "*1*");
    53. WildcardQueryBuilder bsVersion2 = QueryBuilders.wildcardQuery("type", "*j*");
    54. boolQueryBuilder.must(bsVersion).should(bsVersion2);
    55. NativeSearchQuery dsl = new NativeSearchQueryBuilder()
    56. }
    57. //高亮
    58. //默认情况下:只能对查询字段高亮!!!
    59. //加了.requireFieldMatch(false) 可以对非查询字段高亮,具体看下文
    60. @PostMapping("/es/highlight")
    61. public void highlight() {
    62. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    63. //wildcardQuery:通配符查询
    64. WildcardQueryBuilder bsVersion = QueryBuilders.wildcardQuery("bsVersion", "*1*");
    65. WildcardQueryBuilder bsVersion2 = QueryBuilders.wildcardQuery("type", "*j*");
    66. boolQueryBuilder.must(bsVersion).should(bsVersion2);
    67. NativeSearchQuery dsl = new NativeSearchQueryBuilder()
    68. .withQuery(boolQueryBuilder)
    69. .withHighlightFields(
    70. //.requireFieldMatch(false) : 加了可以对非查询字段高亮
    71. new HighlightBuilder.Field("bsVersion").preTags("").postTags("").requireFieldMatch(false),
    72. new HighlightBuilder.Field("provinceNameCn").preTags("").postTags("").requireFieldMatch(false),
    73. new HighlightBuilder.Field("isp").preTags("").postTags("").requireFieldMatch(false),
    74. new HighlightBuilder.Field("type").preTags("").postTags("").requireFieldMatch(false),
    75. new HighlightBuilder.Field("agentId").preTags("").postTags("").requireFieldMatch(false)
    76. )
    77. .build();
    78. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    79. log.info("总条数:{}", search.getTotalHits());
    80. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    81. // 高亮字段是个大MAP 高亮字段集合 = {bsVersion=[<em>115</em>]} //K=字段名 V=高亮了的数据集合
    82. Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
    83. System.out.println("获取高亮字段集合:bsVersion = " + highlightFields.get("bsVersion"));
    84. System.out.println("获取高亮字段集合:provinceNameCn = " + highlightFields.get("provinceNameCn"));
    85. System.out.println("获取高亮字段集合:isp = " + highlightFields.get("isp"));
    86. System.out.println("获取高亮字段集合:type = " + highlightFields.get("type"));
    87. System.out.println("获取高亮字段集合:agentId = " + highlightFields.get("agentId"));
    88. List<String> bsVersionResult = highlightFields.get("bsVersion");
    89. for (String s : bsVersionResult) {
    90. System.out.println("bsVersion集合每一个值为 = " + s);
    91. }
    92. // highlightFields.forEach((k, v) -> {
    93. // //获取高亮字段:k = bsVersion v = [<em>115</em>]
    94. // System.out.println("获取高亮字段:k = " + k + " v = " + v);
    95. // });
    96. }
    97. log.info("总条数:{}", search.getTotalHits());
    98. System.out.println("search.getSearchHits().size() = " + search.getSearchHits().size());
    99. }
    100. //排序
    101. @PostMapping("/es/sort")
    102. public void sort() {
    103. MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
    104. //备注:这里用的是NativeSearchQueryBuilder:xxxBuilder。最后一定要.build();,不然条件用不了
    105. NativeSearchQuery dsl = new NativeSearchQueryBuilder()
    106. .withQuery(matchAllQuery)
    107. //备注:应该是要keyword,paasword这一类才能排序。我用text类型排序报:非法字段异常
    108. .withSorts(SortBuilders.fieldSort("appId").order(SortOrder.ASC)) //排序:根据bsVersion升序排序
    109. .build();
    110. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    111. log.info("总条数:{}", search.getTotalHits());
    112. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    113. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    114. System.out.println("单条文档的id = " + searchHit.getId());
    115. System.out.println("单条文档的评分 = " + searchHit.getScore());
    116. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    117. }
    118. }
    119. //分页
    120. @PostMapping("/es/page")
    121. public void page() {
    122. Integer page = 1;
    123. Integer size = 10;
    124. MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
    125. NativeSearchQuery dsl = new NativeSearchQuery(matchAllQuery);
    126. //分页
    127. Pageable pageable = PageRequest.of((page - 1) * size, size);
    128. dsl.setPageable(pageable);
    129. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    130. log.info("总条数:{}", search.getTotalHits());
    131. // 获取当前页数
    132. log.info("当前页数:{}", page);
    133. // 获取当前页的条数
    134. int currentSize = search.getSearchHits().size();
    135. log.info("当前页条数:{}", currentSize);
    136. //数据列表:search.getSearchHits() for出每一条,然后加到list中
    137. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    138. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    139. System.out.println("单条文档的id = " + searchHit.getId());
    140. System.out.println("单条文档的评分 = " + searchHit.getScore());
    141. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    142. }
    143. }
    144. //布尔查询
    145. @PostMapping("/es/boolQueryBuilder")
    146. public void boolQueryBuilder() {
    147. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    148. //must 必须满足且参与算分
    149. boolQueryBuilder.must(QueryBuilders.matchQuery("bsVersion", "114"));
    150. //mustNot 必须不满足 appID 300-700之间不参与查询(就是直接筛掉了)
    151. boolQueryBuilder.mustNot(QueryBuilders.rangeQuery("appId").gte("300").lte("700"));
    152. //filter 必须满足,且不参与算分
    153. // boolQueryBuilder.filter(QueryBuilders.termQuery("agentId", "298_ead348abbaf30f48"));
    154. NativeSearchQuery dsl = new NativeSearchQuery(boolQueryBuilder);
    155. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    156. log.info("总条数:{}", search.getTotalHits());
    157. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    158. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    159. System.out.println("单条文档的id = " + searchHit.getId());
    160. System.out.println("单条文档的评分 = " + searchHit.getScore());
    161. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    162. }
    163. }
    164. //算分函数查询
    165. @PostMapping("/es/FunctionScoreQueryBuilder")
    166. public void FunctionScoreQueryBuilder() {
    167. FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
    168. //原始查询
    169. QueryBuilders.matchAllQuery(),
    170. //算分数组
    171. new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
    172. //第一个元素
    173. new FunctionScoreQueryBuilder.FilterFunctionBuilder(
    174. //过滤器
    175. QueryBuilders.matchQuery("bsVersion", "114"),
    176. //权重
    177. ScoreFunctionBuilders.weightFactorFunction(10)
    178. ),
    179. //第二个元素
    180. new FunctionScoreQueryBuilder.FilterFunctionBuilder(
    181. //过滤器
    182. QueryBuilders.matchQuery("bsVersion", "115"),
    183. //权重
    184. ScoreFunctionBuilders.weightFactorFunction(10)
    185. )
    186. }).boostMode(CombineFunction.REPLACE);
    187. NativeSearchQuery dsl = new NativeSearchQuery(functionScoreQueryBuilder);
    188. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    189. log.info("总条数:{}", search.getTotalHits());
    190. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    191. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    192. System.out.println("单条文档的id = " + searchHit.getId());
    193. System.out.println("单条文档的评分 = " + searchHit.getScore());
    194. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    195. }
    196. }
    197. //范围查询
    198. @PostMapping("/es/rangeQuery")
    199. public void rangeQuery() {
    200. //范围查询 appId字段 >=0 <=200 的数据
    201. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("appId").gte("0").lte("200");
    202. NativeSearchQuery dsl = new NativeSearchQuery(rangeQueryBuilder);
    203. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    204. log.info("总条数:{}", search.getTotalHits());
    205. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    206. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    207. System.out.println("单条文档的id = " + searchHit.getId());
    208. System.out.println("单条文档的评分 = " + searchHit.getScore());
    209. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    210. }
    211. }
    212. //精确查询
    213. @PostMapping("/es/termQuery")
    214. public void termQuery() {
    215. //根据isp字段 精确查询 内网IP
    216. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("isp", " 内网IP ");
    217. NativeSearchQuery dsl = new NativeSearchQuery(termsQueryBuilder);
    218. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    219. log.info("总条数:{}", search.getTotalHits());
    220. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    221. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    222. System.out.println("单条文档的id = " + searchHit.getId());
    223. System.out.println("单条文档的评分 = " + searchHit.getScore());
    224. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    225. }
    226. }
    227. //多字段查询
    228. @PostMapping("/es/multiMatchQuery")
    229. public void multiMatchQuery() {
    230. //备注:字段必须是text类型,可以分词类型!!!!
    231. //查找keyword、数值、日期、boolean等会报错!!!
    232. //如果放入精确类型的字段,会报错!!!!
    233. MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("114", "bsVersion", "type");//查询114根据"bsVersion","type"
    234. NativeSearchQuery dsl = new NativeSearchQuery(multiMatchQuery);
    235. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    236. log.info("总条数:{}", search.getTotalHits());
    237. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    238. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    239. System.out.println("单条文档的id = " + searchHit.getId());
    240. System.out.println("单条文档的评分 = " + searchHit.getScore());
    241. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    242. }
    243. }
    244. //单字段查询
    245. @PostMapping("/es/matchQuery")
    246. public void matchQuery() {
    247. MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("bsVersion", "114");
    248. NativeSearchQuery dsl = new NativeSearchQuery(matchQuery);
    249. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    250. log.info("总条数:{}", search.getTotalHits());
    251. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    252. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    253. System.out.println("单条文档的id = " + searchHit.getId());
    254. System.out.println("单条文档的评分 = " + searchHit.getScore());
    255. System.out.println("单条文档索引名(表名) = " + searchHit.getIndex());//298_ops-web-js_1就是你输入的索引库名
    256. }
    257. }
    258. //查询所有
    259. @PostMapping("/es/matchAllQuery")
    260. public void matchAllQuery() {
    261. MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
    262. NativeSearchQuery dsl = new NativeSearchQuery(matchAllQuery);
    263. SearchHits<Map> search = elasticsearchRestTemplate.search(dsl, Map.class, IndexCoordinates.of("298_ops-web-js_1"));
    264. log.info("总条数:{}", search.getTotalHits());
    265. log.info("查询原始对象:{}", search.getSearchHits());
    266. log.info("分数值:{}", search.getMaxScore());
    267. log.info("有无聚合:{}", search.hasAggregations());
    268. log.info("返回搜索命中数量的关系,例如精确值、估计值:{}", search.getTotalHitsRelation());
    269. log.info("判断是否存在搜索命中结果:{}", search.hasSearchHits());
    270. //原始结果的每一条数据
    271. for (SearchHit<Map> searchHit : search.getSearchHits()) {
    272. System.out.println("单条文档 = " + searchHit);
    273. System.out.println("单条文档的原数据 = " + searchHit.getContent());
    274. }
    275. }
    276. }

    ————————————————————————————————————

  • 相关阅读:
    从ReentrantLock角度解析AQS
    算法 - 正方形数量
    一步步来,如何高效优质的锻炼身体
    服务器搭建(TCP套接字)-libevent版(服务端)
    基于nacos netflix loadbalancer灰度发布策略
    RibbonPage
    Nwafu-OJ-1512 Problem 二分法解方程
    网络热传App鉴定 |「得物」疑私删用户视频?从技术角度还原事件始末
    Aigtek:介电弹性体高压放大器在软体机器人研究中的应用
    线程安全的使用ArrayList和HashMap
  • 原文地址:https://blog.csdn.net/weixin_50914566/article/details/134468453