文章目录
- 一、核心API工具类
 - 二、查询类型与API使用
 - 1. 全文检索查询
 - (1) Match Query
 - (2) Multi-Match Query
 
- 2. 精确查询
 - (1) Term Query
 - (2) Range Query
 
- 3. 复合查询(Boolean Query)
 
- 三、综合案例实现
 - 需求说明:
 - Java代码实现:
 
- 四、关键点说明
 - 五、扩展建议
 
一、核心API工具类
QueryBuilders 工具类提供构建所有ES查询的静态方法,与DSL语法一一对应

二、查询类型与API使用
1. 全文检索查询
(1) Match Query
DSL示例:
GET /index/_search
{"query": {"match": {"field": "搜索内容"}}
}
 
Java API:
QueryBuilders.matchQuery("字段名", "搜索内容");
 
(2) Multi-Match Query
DSL示例:
{"multi_match": {"query": "搜索内容","fields": ["字段1", "字段2"]}
}
 
Java API(可变参数):
QueryBuilders.multiMatchQuery("搜索内容", "字段1", "字段2", ...);
 

2. 精确查询
(1) Term Query
DSL示例:
{"term": {"字段名": {"value": "精确值"}}
}
 
Java API:
QueryBuilders.termQuery("字段名", "精确值");
 
(2) Range Query
DSL示例:
{"range": {"price": {"gte": 100,"lte": 300}}
}
 
Java API:
// 支持链式调用
QueryBuilders.rangeQuery("price").gte(100).lte(300);
 

3. 复合查询(Boolean Query)
DSL结构:
{"bool": {"must": [ ... ],     // 必须匹配,参与算分"filter": [ ... ],   // 必须匹配,不参与算分"should": [ ... ],   // 至少匹配一个"must_not": [ ... ]  // 必须不匹配}
}
 
Java API:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(...))    // 添加必须条件.filter(QueryBuilders.termQuery(...))   // 添加过滤条件.should(...)                            // 添加可选条件.mustNot(...);                          // 添加排除条件
 

三、综合案例实现
需求说明:
- 搜索"脱脂牛奶"
 - 品牌必须为"德亚"
 - 价格低于30000 元
 
Java代码实现:
@Test
void testComplexSearch() throws IOException {
// 1. 创建SearchRequest
SearchRequest request = new SearchRequest("items");// 2. 构建DSL
request.source().query(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name", "脱脂牛奶")) // 全文检索,参与算分.filter(QueryBuilders.termQuery("brand", "德亚"))   // 精确匹配,不参与算分.filter(QueryBuilders.rangeQuery("price").lt(30000)) // 范围过滤);// 3. 发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4. 解析结果(封装方法)
parseResponse(response);
}// 结果解析封装方法
private void parseResponse(SearchResponse response) {SearchHits hits = response.getHits();for (SearchHit hit : hits) {String json = hit.getSourceAsString();ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);System.out.println("doc = " + doc);}
}
 
运行结果:

四、关键点说明
- 链式调用:
BoolQueryBuilder支持链式调用,可添加多个子查询条件 - 算分控制: 
must:条件必须满足,且参与相关性算分filter:条件必须满足,但不参与算分,适合精确过滤
 - 参数映射:Java API参数与DSL结构一一对应,可通过DSL反推Java代码
 - 可变参数:
multiMatchQuery()使用可变参数接收多个字段名 
五、扩展建议
- 地理查询:使用 
geoDistanceQuery()实现附近酒店搜索 - 算分函数:结合 
functionScoreQuery()实现自定义排序 - 高亮显示:通过 
HighlightBuilder添加搜索结果高亮 
