SpringBoot集成Elasticsearch7.x(2)|(高级查询)

红太狼 2023-10-03 19:38 92阅读 0赞

SpringBoot集成Elasticsearch7.x(2)|(复杂查询)


文章目录 SpringBoot集成Elasticsearch7.x(2)|(复杂查询) @[TOC] 前言 一、ElasticSearch是什么? 二、Kibana是什么? 三、复杂查询 1.同字段多条件匹配查询(or) 2.范围查询(> >= < <=) 3.不同字段多条件查询(and) 4.不同字段多条件或查询(or) 总结

章节
第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现)
第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询)
第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询)
第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合查询)
第五章链接: SpringBoot集成Elasticsearch7.x(5)|(term、match、match_phrase区别)
第六章链接: SpringBoot集成Elasticsearch8.x(6)|(新版本Java API Client使用)
第七章链接: SpringBoot集成Elasticsearch8.x(7)|(新版本Java API Client使用完整示例)

前言

本章节主要介绍SpringBoot项目集成ElasticSearch的一些相关知识,主要介绍的是基于Java High Level REST Client方式实现ElasticSearch高级查询操作以及对应kibana控制台JSON格式访问对照。

一、ElasticSearch是什么?

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

二、Kibana是什么?

Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。

三、复杂查询

1.同字段多条件匹配查询(or)

多个匹配条件,满足其中一个即可,类似于sql中的or

  1. GET /architecture_index/_search
  2. {
  3. "query":{
  4. "terms": {
  5. "city.keyword": ["武汉","厦门"]
  6. }
  7. }
  8. }

实现代码如下

  1. @Test
  2. public void searchAll() throws IOException {
  3. //定义请求对象
  4. SearchRequest request = new SearchRequest("architecture_index");
  5. //设置分页条件
  6. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  7. //制定检索条件
  8. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("city.keyword", "武汉", "厦门");
  9. //组装
  10. searchSourceBuilder.query(termsQueryBuilder);
  11. //执行
  12. request.source(searchSourceBuilder);
  13. SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  14. //打印数据
  15. for (SearchHit hit : search.getHits().getHits()) {
  16. ArchitectureDto art = JSONObject.parseObject(hit.getSourceAsString(), ArchitectureDto.class);
  17. System.out.println(JSON.toJSONString(art));
  18. }
  19. }

2.范围查询(> >= < <=)

针对数字类型的查询,满足给的范围gt是大于,gte是大于等于,lte是小于等于,lt是小于类似于sql中 >,>=,<,<=。

  1. GET /architecture_index/_search
  2. {
  3. "query":{
  4. "range": {
  5. "price":{
  6. "gte": 50,
  7. "lte": 100
  8. }
  9. }
  10. }
  11. }

实现代码如下

  1. @Test
  2. public void searchByFilter() throws IOException {
  3. //定义请求对象
  4. SearchRequest request = new SearchRequest("architecture_index");
  5. //制定检索条件
  6. SearchSourceBuilder builder = new SearchSourceBuilder();
  7. builder.query(QueryBuilders.rangeQuery("price").gte(70).lte(100));
  8. request.source(builder);
  9. // 执行
  10. SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  11. // 打印数据
  12. for (SearchHit hit : search.getHits().getHits()) {
  13. ArchitectureDto art = JSONObject.parseObject(hit.getSourceAsString(), ArchitectureDto.class);
  14. System.out.println(JSON.toJSONString(art));
  15. }
  16. }

3.不同字段多条件查询(and)

多个匹配条件,同时需要满足,类似于sql中的and
bool 可以用来合并多个条件查询结果的布尔逻辑,它包含一下操作符:
must : 多个查询条件的完全匹配,相当于 and。
must_not : 多个查询条件的相反匹配,相当于 not。
should : 至少有一个查询条件匹配, 相当于 or。

  1. GET /architecture_index/_search
  2. {
  3. "query":{
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "city.keyword": {
  9. "value": "合肥"
  10. }
  11. }},
  12. {
  13. "range": {
  14. "price": {
  15. "gte": 50,
  16. "lte": 80
  17. }
  18. }}
  19. ]
  20. }
  21. }
  22. }

实现代码如下

  1. @Test
  2. public void searchByBolt() throws IOException {
  3. //定义请求对象
  4. SearchRequest request = new SearchRequest("architecture_index");
  5. //制定检索条件
  6. SearchSourceBuilder builder = new SearchSourceBuilder();
  7. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  8. //封装查询条件
  9. boolQueryBuilder.must(QueryBuilders.termQuery("city.keyword","合肥"));
  10. boolQueryBuilder.must(QueryBuilders.rangeQuery("price").gte(50).lte(80));
  11. builder.query(boolQueryBuilder);
  12. request.source(builder);
  13. //执行
  14. SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  15. //打印数据
  16. for (SearchHit hit : search.getHits().getHits()) {
  17. ArchitectureDto art = JSONObject.parseObject(hit.getSourceAsString(), ArchitectureDto.class);
  18. System.out.println(JSON.toJSONString(art));
  19. }
  20. }

4.不同字段多条件或查询(or)

多个条件匹配,满足一个即可
should : 至少有一个查询条件匹配, 相当于 or。

  1. GET /architecture_index/_search
  2. {
  3. "query":{
  4. "bool": {
  5. "should": [
  6. {
  7. "term": {
  8. "city.keyword": {
  9. "value": "合肥"
  10. }
  11. }
  12. },
  13. {
  14. "range": {
  15. "price": {
  16. "gte": 50,
  17. "lte": 80
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. }
  24. }

实现代码如下

  1. @Test
  2. public void searchByBolt() throws IOException {
  3. //定义请求对象
  4. SearchRequest request = new SearchRequest("architecture_index");
  5. //制定检索条件
  6. SearchSourceBuilder builder = new SearchSourceBuilder();
  7. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  8. //封装查询条件
  9. boolQueryBuilder.should(QueryBuilders.termQuery("city.keyword","合肥"));
  10. boolQueryBuilder.should(QueryBuilders.rangeQuery("price").gte(50).lte(80));
  11. builder.query(boolQueryBuilder);
  12. request.source(builder);
  13. //执行
  14. SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  15. //打印数据
  16. for (SearchHit hit : search.getHits().getHits()) {
  17. ArchitectureDto art = JSONObject.parseObject(hit.getSourceAsString(), ArchitectureDto.class);
  18. System.out.println(JSON.toJSONString(art));
  19. }
  20. }

总结

以上就是SpringBoot集成Elasticsearch数据库内容,在验证过程中遇到很多问题,如果大家在使用过程中遇到问题欢迎留言。

发表评论

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

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

相关阅读