Elasticsearch 是一个基于 Lucene 的搜索引擎,提供了丰富的查询功能。在 Java 应用程序中,我们可以使用 Elasticsearch 的 RestHighLevelClient 来执行各种查询。本文将介绍如何使用 RestHighLevelClient 执行 matchQuery
、multiMatchQuery
、termQuery
、rangeQuery
和 boolQuery
,并提供每种查询对应的 DSL 对比。
环境准备
确保你的项目中已经添加了 Elasticsearch 客户端库的依赖。如果使用 Maven,可以在 pom.xml
文件中添加如下依赖:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level</artifactId>
<version>7.10.0</version> <!-- 使用适合的版本号 -->
</dependency>
查询示例
1. Match Query
Java Code
@Test
void matchQueryTest() throws IOException {
// 1. 准备 SearchRequest
SearchRequest request = new SearchRequest("hotel"); // 指定索引名称
// 2. 准备 DSL 查询
request.source().query(
QueryBuilders.matchQuery("name", "如家") // 构建查询条件
);
// 3. 发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4. 解析响应
printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
"query": {
"match": {
"name": "如家"
}
}
}
2. Multi Match Query
Java Code
@Test
void multiMatchQueryTest() throws IOException {
SearchRequest request = new SearchRequest("hotel");
request.source().query(
QueryBuilders.multiMatchQuery("如家", "name", "description")
);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "如家",
"fields": ["name", "description"]
}
}
}
3. Term Query
Java Code
@Test
void termQueryTest() throws IOException {
SearchRequest request = new SearchRequest("hotel");
request.source().query(
QueryBuilders.termQuery("city", "杭州")
);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
"query": {
"term": {
"city": "杭州"
}
}
}
4. Range Query
Java Code
@Test
void rangeQueryTest() throws IOException {
SearchRequest request = new SearchRequest("hotel");
request.source().query(
QueryBuilders.rangeQuery("price").gte(100).lte(250)
);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 250
}
}
}
}
5. Bool Query
Java Code
@Test
void boolQueryTest() throws IOException {
SearchRequest request = new SearchRequest("hotel");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termQuery("city", "杭州"));
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
request.source().query(boolQuery);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"city": "杭州"
}
}
],
"filter": [
{
"range": {
"price": {
"lte": 250
}
}
}
]
}
}
}
通用响应解析方法
private void printSearchResponse(SearchResponse response) throws IOException {
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到 " + total + " 条数据");
for (SearchHit hit : searchHits.getHits()) {
String json = hit.getSourceAsString();
System.out.println(json);
}
}
结语
通过上述示例,我们可以看到如何使用 Java 的 RestHighLevelClient 来执行不同类型的 Elasticsearch 查询,并与 DSL 查询进行了对比。这些查询类型覆盖了大多数搜索场景,从简单的全文搜索到复杂的复合查询。理解这些查询的构建方式对于开发高效的搜索应用至关重要。希望本文能帮助你更好地使用 Elasticsearch 的查询功能。