在 Java 中调用 Elasticsearch 的查询 API 可以使用官方提供的客户端库,例如 elasticsearch-rest-high-level-client。以下是一个示例,展示如何使用 Java 调用 Elasticsearch 的查询 API 并获取结果。
1. 添加依赖
首先,在你的 pom.xml 文件中添加 Elasticsearch 客户端的依赖:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.2</version>
</dependency>
2. 编写 Java 代码
以下是一个示例代码,展示了如何使用 Java 调用 Elasticsearch 的布尔查询 API 并处理返回的结果
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
import java.util.Map;
public class ElasticsearchQueryExample {
public static void main(String[] args) {
// 创建 RestHighLevelClient 实例
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
try {
// 构建查询请求
SearchRequest searchRequest = new SearchRequest("my-index-000001");
// 构建查询条件
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
boolQuery.must(new MatchQueryBuilder("title", "Elasticsearch"));
boolQuery.must(new RangeQueryBuilder("publish_date").gte("2020-01-01"));
boolQuery.should(new TermQueryBuilder("tags", "tutorial"));
boolQuery.should(new TermQueryBuilder("tags", "guide"));
boolQuery.mustNot(new TermQueryBuilder("status", "draft"));
boolQuery.filter(new TermQueryBuilder("language", "en"));
// 构建搜索源构建器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(boolQuery);
// 设置搜索请求的源构建器
searchRequest.source(sourceBuilder);
// 执行搜索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理搜索结果
System.out.println("Total hits: " + searchResponse.getHits().getTotalHits().value);
for (Map<String, Object> hit : searchResponse.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭客户端
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
示例中must、should、must_not 和 filter的用法
1. must
含义:所有 must 子句中的条件都必须满足。
评分:参与评分计算,影响文档的相关性得分。
示例:
{
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" }},
{ "range": { "publish_date": { "gte": "2020-01-01" }}}
]
}
}
//上述查询要求文档的 title 字段包含 "Elasticsearch",并且 publish_date 字段大于或等于 "2020-01-01"。
2. should
含义:至少有一个 should 子句中的条件满足。
评分:参与评分计算,影响文档的相关性得分。
示例:
{
"bool": {
"should": [
{ "term": { "tags": "tutorial" }},
{ "term": { "tags": "guide" }}
]
}
}
//上述查询要求文档的 tags 字段包含 "tutorial" 或 "guide" 中的一个或多个。
3. must_not
含义:所有 must_not 子句中的条件都不能满足。
评分:不参与评分计算。
示例:
{
"bool": {
"must_not": [
{ "term": { "status": "draft" }}
]
}
}
//上述查询要求文档的 status 字段不能是 "draft"。
4. filter
含义:所有 filter 子句中的条件都必须满足。
评分:不参与评分计算,仅用于过滤文档。
示例
{
"bool": {
"filter": [
{ "term": { "language": "en" }}
]
}
}
//上述查询要求文档的 language 字段必须是 "en",但不会影响文档的相关性得分。
综合示例
下面是一个综合示例,展示了如何在一个布尔查询中同时使用 must、should、must_not 和 filter 子句:
{
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" }},
{ "range": { "publish_date": { "gte": "2020-01-01" }}}
],
"should": [
{ "term": { "tags": "tutorial" }},
{ "term": { "tags": "guide" }}
],
"must_not": [
{ "term": { "status": "draft" }}
],
"filter": [
{ "term": { "language": "en" }}
]
}
}
解释
must 子句:要求文档的 title 字段包含 "Elasticsearch",并且 publish_date 字段大于或等于 "2020-01-01"。
should 子句:要求文档的 tags 字段包含 "tutorial" 或 "guide" 中的一个或多个。
must_not 子句:要求文档的 status 字段不能是 "draft"。
filter 子句:要求文档的 language 字段必须是 "en",但不影响评分。
通过这些子句的组合,可以构建非常灵活和复杂的查询条件,满足不同的搜索需求。