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数据库内容,在验证过程中遇到很多问题,如果大家在使用过程中遇到问题欢迎留言。