【Elasticsearch】 复合查询
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea
【Elasticsearch】 复合查询
文章目录
- 【Elasticsearch】 复合查询
- 引言
- 1. Elasticsearch Java 客户端简介
- 1.1 Maven 依赖
- 1.2 客户端初始化
- 2. Bool 查询详解
- 2.1 Bool 查询的基本结构
- 2.2 Java 代码示例
- 2.3 Bool 查询的高级用法
- 3. 其他复合查询类型
- 3.1 Constant Score 查询
- 3.1.1 Java 代码示例
- 3.2 Dis Max 查询
- 3.2.1 Java 代码示例
- 4. 总结
- 参考资料
引言
在现代的大数据时代,Elasticsearch 已经成为了一个不可或缺的搜索引擎工具,广泛应用于日志分析、全文搜索、实时数据分析等场景。作为一个基于 Lucene 的分布式搜索引擎,Elasticsearch 提供了强大的搜索能力,尤其是在处理复杂查询时,其灵活的查询 DSL(Domain Specific Language
)使得开发者能够轻松构建各种复杂的查询逻辑。
在 Elasticsearch 中,复合查询(Compound Queries
)是一类非常重要的查询类型,它允许开发者将多个子查询组合在一起,形成一个更复杂的查询逻辑。其中,bool 查询 是最常用的复合查询之一,它通过 must
、should
、must_not
等子句,能够灵活地组合多个查询条件,实现诸如“与”、“或”、“非”等逻辑操作。
本文将深入探讨 Elasticsearch 中的复合查询,特别是 bool 查询 的使用方法,并结合实际的 Java 代码示例,展示如何在实际开发中灵活运用这些查询类型。此外,我们还将介绍其他常见的复合查询类型,如 constant_score 查询 和 dis_max 查询,帮助开发者根据实际需求选择合适的查询方式。
1. Elasticsearch Java 客户端简介
在开始深入探讨复合查询之前,我们首先需要了解如何在 Java 项目中使用 Elasticsearch。Elasticsearch 提供了官方的 Java 客户端库,开发者可以通过 Maven 或 Gradle 将其引入到项目中。
1.1 Maven 依赖
要在 Java 项目中使用 Elasticsearch,首先需要在 pom.xml
文件中添加以下 Maven 依赖:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
这些依赖项包括了 Elasticsearch 的高级 REST 客户端、核心库以及日志框架 Log4j。通过这些依赖项,开发者可以在 Java 项目中轻松地与 Elasticsearch 集群进行交互。
1.2 客户端初始化
在使用 Elasticsearch 客户端之前,首先需要初始化一个 RestHighLevelClient
实例。以下是一个简单的初始化示例:
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
public class ElasticsearchClient {
private static RestHighLevelClient client;
public static RestHighLevelClient getClient() {
if (client == null) {
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http")
);
client = new RestHighLevelClient(builder);
}
return client;
}
}
在这个示例中,我们创建了一个 RestHighLevelClient
实例,并配置了连接到本地 Elasticsearch 集群的地址和端口。
2. Bool 查询详解
Bool 查询 是 Elasticsearch 中最常用的复合查询类型之一。它允许开发者通过 must
、should
、must_not
等子句,将多个查询条件组合在一起,形成一个复杂的查询逻辑。
2.1 Bool 查询的基本结构
Bool 查询的基本结构如下:
{
"query": {
"bool": {
"must": [],
"should": [],
"must_not": [],
"filter": []
}
}
}
- must:查询条件必须满足,相当于逻辑“与”。
- should:查询条件可以满足,相当于逻辑“或”。
- must_not:查询条件必须不满足,相当于逻辑“非”。
- filter:与
must
类似,但不参与评分。
2.2 Java 代码示例
以下是一个使用 Java 客户端构建 Bool 查询的示例:
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.builder.SearchSourceBuilder;
public class BoolQueryExample {
public static void main(String[] args) {
RestHighLevelClient client = ElasticsearchClient.getClient();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchQuery("title", "Elasticsearch"));
boolQuery.should(QueryBuilders.matchQuery("content", "Java"));
boolQuery.mustNot(QueryBuilders.matchQuery("status", "deleted"));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(boolQuery);
SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在这个示例中,我们构建了一个 Bool 查询,要求文档的 title
字段必须包含 “Elasticsearch”,content
字段可以包含 “Java”,并且 status
字段不能为 “deleted”。
2.3 Bool 查询的高级用法
Bool 查询不仅可以嵌套其他查询类型,还可以嵌套自身,从而实现更复杂的查询逻辑。例如:
BoolQueryBuilder nestedBoolQuery = QueryBuilders.boolQuery();
nestedBoolQuery.must(QueryBuilders.matchQuery("author", "John Doe"));
nestedBoolQuery.should(QueryBuilders.matchQuery("tags", "tech"));
boolQuery.must(nestedBoolQuery);
在这个示例中,我们创建了一个嵌套的 Bool 查询,并将其作为外层 Bool 查询的 must
条件。
3. 其他复合查询类型
除了 Bool 查询,Elasticsearch 还提供了其他几种常用的复合查询类型,如 constant_score 查询 和 dis_max 查询。
3.1 Constant Score 查询
Constant Score 查询 是一种将查询结果的得分固定为指定值的查询类型。它通常用于过滤查询,不关心文档的得分,只关心文档是否匹配。
3.1.1 Java 代码示例
import org.elasticsearch.index.query.ConstantScoreQueryBuilder;
ConstantScoreQueryBuilder constantScoreQuery = QueryBuilders.constantScoreQuery(
QueryBuilders.termQuery("status", "active")
).boost(2.0f);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(constantScoreQuery);
SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.toString());
} catch (IOException e) {
e.printStackTrace();
}
在这个示例中,我们创建了一个 Constant Score 查询,将 status
字段为 “active” 的文档得分固定为 2.0。
3.2 Dis Max 查询
Dis Max 查询 是一种用于在多个字段中查找最佳匹配的查询类型。它会将多个查询的结果进行合并,并返回得分最高的文档。
3.2.1 Java 代码示例
import org.elasticsearch.index.query.DisMaxQueryBuilder;
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
disMaxQuery.add(QueryBuilders.matchQuery("title", "Elasticsearch"));
disMaxQuery.add(QueryBuilders.matchQuery("content", "Java"));
disMaxQuery.tieBreaker(0.7f);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(disMaxQuery);
SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.toString());
} catch (IOException e) {
e.printStackTrace();
}
在这个示例中,我们创建了一个 Dis Max 查询,分别在 title
和 content
字段中查找最佳匹配的文档,并设置了 tieBreaker
参数来控制得分计算。
4. 总结
通过本文的介绍,我们深入探讨了 Elasticsearch 中的复合查询,特别是 bool 查询 的使用方法。我们还介绍了其他常见的复合查询类型,如 constant_score 查询 和 dis_max 查询,并通过实际的 Java 代码示例展示了如何在实际开发中灵活运用这些查询类型。
掌握这些复合查询的使用方法,将帮助开发者更好地应对复杂的搜索需求,提升应用的搜索性能和用户体验。
参考资料
- Elasticsearch 官方文档
- Elasticsearch Java 高级 REST 客户端文档
- Elasticsearch 复合查询官方指南