Elasticsearch Java 客户端 是 Elasticsearch 官方提供的 SDK,用于在 Java 应用中与 Elasticsearch 集群进行通信。
它封装了 Elasticsearch 的 HTTP API,支持构建查询请求、执行查询、索引数据等操作。
常用查询类型的详细解析及其用法:
1. BoolQuery
作用:用于组合多个查询条件,是 Elasticsearch 中最常用的查询类型。
BoolQuery
允许组合多个子查询,并指定它们之间的逻辑关系,例如:
-
must
:子查询必须满足(相当于逻辑 AND)。 -
should
:子查询可以满足(相当于逻辑 OR),至少满足一个时提高匹配评分。 -
filter
:子查询必须满足,但不会影响评分(相当于无评分的 AND)。 -
must_not
:子查询必须不满足(相当于逻辑 NOT)。
操作方法
//创建一个 BoolQuery 的构建器对象,用于构建复杂的布尔查询(Boolean Query)。
BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
// must: 条件必须满足
boolQueryBuilder.must(m -> m.match(t -> t.field("title").query("Elasticsearch")));
// should: 条件可以满足(加权影响评分)
boolQueryBuilder.should(s -> s.match(t -> t.field("description").query("Java")));
// filter: 条件必须满足,但不影响评分
boolQueryBuilder.filter(f -> f.range(r -> r.field("price").gte(10).lte(100)));
// must_not: 条件必须不满足
boolQueryBuilder.mustNot(n -> n.term(t -> t.field("status").value("inactive")));
// 构建为 BoolQuery 对象
Query boolQuery = boolQueryBuilder.build()._toQuery();
/*
_toQuery() 方法是 Elasticsearch Java 客户端提供的一种转换方法,用于将具体查询(如 BoolQuery、MatchQuery)封装为通用的 Query 类型。
为什么需要 _toQuery()?
在 Elasticsearch 的 Java 客户端中,很多具体查询类型(如 BoolQuery、MatchQuery 等)都继承自 Query 或需要被封装为 Query 类型,以便兼容各种查询场景。例如:
SearchRequest 的 .query() 方法需要接受 Query 类型的参数。
_toQuery() 方法将具体查询类型适配为通用类型,便于统一处理。
*/
对应的 DSL
{
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"should": [
{ "match": { "description": "Java" } }
],
"filter": [
{ "range": { "price": { "gte": 10, "lte": 100 } } }
],
"must_not": [
{ "term": { "status": "inactive" } }
]
}
}
2. MatchQuery
作用:用于全文检索,查询字段会被分词并匹配。
操作方法
Query matchQuery = Query.of(q -> q.match(m -> m
.field("content") // 查询的字段
.query("Elasticsearch Java client"))); // 查询的值
对应的 DSL
{
"match": {
"content": "Elasticsearch Java client"
}
}
注意:
-
match
查询支持模糊匹配,因为会对查询词进行分词后逐一匹配。 -
适用于全文检索场景,如文章标题、内容等。
3. TermQuery
作用:用于精确匹配字段的值,字段不会分词,适用于关键词匹配。
操作方法
Query termQuery = Query.of(q -> q.term(t -> t
.field("status") // 查询的字段
.value("active"))); // 精确匹配的值
对应的 DSL
{
"term": {
"status": "active"
}
}
注意:
-
适用场景:精确匹配,例如状态字段、ID、分类字段等。
-
查询字段类型应该是
keyword
或integer
,因为这些类型不分词。
4. RangeQuery
作用:用于范围查询,适合数值、日期范围等场景。
操作方法
Query rangeQuery = Query.of(q -> q.range(r -> r
.field("price") // 查询的字段
.gte(10) // 大于等于
.lte(100))); // 小于等于
对应的 DSL
{
"range": {
"price": {
"gte": 10,
"lte": 100
}
}
}
注意:
-
支持
gte
(大于等于)、lte
(小于等于)、gt
(大于)、lt
(小于)。 -
适用于数值范围或时间范围查询。
5. NestedQuery
作用:用于查询嵌套字段,适合在嵌套文档中进行精确匹配或组合查询。
操作方法
Query nestedQuery = Query.of(q -> q.nested(n -> n
.path("attributes") // 嵌套字段路径
.query(nq -> nq.bool(b -> b
.must(m -> m.term(t -> t.field("attributes.key").value("color")))
.must(m -> m.term(t -> t.field("attributes.value").value("red")))))));
对应的 DSL
{
"nested": {
"path": "attributes",
"query": {
"bool": {
"must": [
{ "term": { "attributes.key": "color" } },
{ "term": { "attributes.value": "red" } }
]
}
}
}
}
注意:
-
嵌套字段是通过
nested
类型定义的,需要通过path
指定路径。 -
适用于具有嵌套结构的字段,例如产品属性、嵌套文档等。
总结
Elasticsearch Java 客户端中查询类型的常用操作:
查询类型 | 功能 | 适用场景 |
---|---|---|
BoolQuery | 组合多个查询条件 | 复杂查询,如“与、或、非”逻辑 |
MatchQuery | 全文检索,字段分词 | 标题、内容等模糊匹配 |
TermQuery | 精确匹配,不分词 | ID、分类、状态字段等 |
RangeQuery | 范围查询 | 数值、日期范围 |
NestedQuery | 嵌套查询 | 嵌套文档(如产品属性) |