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

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


章节
第一章链接: 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

GET /architecture_index/_search 
{
  "query":{
    "terms": {
      "city.keyword": ["武汉","厦门"]
    }
  }
}

实现代码如下

    @Test
    public void searchAll() throws IOException {
        //定义请求对象
        SearchRequest request = new SearchRequest("architecture_index");
        //设置分页条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //制定检索条件
        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("city.keyword", "武汉", "厦门");
        //组装
        searchSourceBuilder.query(termsQueryBuilder);
        //执行
        request.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);

        //打印数据
        for (SearchHit hit : search.getHits().getHits()) {
            ArchitectureDto art = JSONObject.parseObject(hit.getSourceAsString(), ArchitectureDto.class);
            System.out.println(JSON.toJSONString(art));
        }
    }

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

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

GET /architecture_index/_search 
{
  "query":{
    "range": {
      "price":{
        "gte": 50,
        "lte": 100
      }
    }
  }
}

实现代码如下

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

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

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

GET /architecture_index/_search 
{
  "query":{
    "bool": {
      "must": [
        {"term": {
          "city.keyword": {
            "value": "合肥"
          }
        }},
        {
          "range": {
            "price": {
              "gte": 50,
              "lte": 80
            }
          }}
      ]
    }
  }
}

实现代码如下

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


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

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

GET /architecture_index/_search 
{
  "query":{
    "bool": {
      "should": [
        {"term": {
          "city.keyword": {
            "value": "合肥"
          }
        }
        },
        {
          "range": {
            "price": {
              "gte": 50,
              "lte": 80
            }
          }
        }
      ]
    }
  }
}

实现代码如下

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


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值