文章目录
- 一、核心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
添加搜索结果高亮