Elasticsearch Query
Eave
2026.09.02
elasticsearch-java 9.5.2 · co.elastic.clients · 基于 Query.of(q -> q.xxx(...)) 写法
一、核心Query类型
| Query类型 | 作用 | 适用字段 | SQL类比 | 写法 |
|---|---|---|---|---|
term |
精确匹配单个值 | keyword |
= |
.term(t -> t.field("brand").value("Apple")) |
terms |
多值精确匹配 | keyword |
IN (...) |
.terms(t -> t.field("category").terms(tt -> tt.value(FieldValue.of("手机"), FieldValue.of("平板")))) |
match |
全文分词匹配 | text |
LIKE '%x%'(分词后) |
.match(m -> m.field("name").query("华为 Mate")) |
multiMatch |
多字段全文匹配 | text |
多列 LIKE | .multiMatch(mm -> mm.fields("name","brand").query("华为")) |
wildcard |
通配符匹配 | keyword |
LIKE '%x%' |
.wildcard(w -> w.field("name").value("*iPhone*")) |
prefix |
前缀匹配 | keyword |
LIKE 'x%' |
.prefix(p -> p.field("name").value("华为")) |
fuzzy |
模糊容错匹配 | keyword |
编辑距离容错 | .fuzzy(f -> f.field("name").value("iPhane").fuzziness("AUTO")) |
range |
范围查询 | number / date |
BETWEEN / > / < |
.range(r -> r.number(n -> n.field("price").gte(JsonData.of(5000.0)))) |
bool |
组合条件 | 任意 | AND / OR / NOT |
.bool(b -> b.must(...).filter(...).should(...).mustNot(...)) |
exists |
字段是否存在 | 任意 | IS NOT NULL |
.exists(e -> e.field("price")) |
matchAll |
匹配所有文档 | 任意 | SELECT * |
.matchAll(m -> m) |
ids |
按 ID 批量查 | _id |
WHERE id IN (...) |
.ids(i -> i.values("1","2","3")) |
二、bool子句用法
| 子句 | 含义 | 是否参与评分 | SQL类比 | 示例 |
|---|---|---|---|---|
must |
必须满足 | 是 | AND |
bool.must(Query.of(q -> q.term(...))) |
filter |
必须满足(不评分,走缓存) | 否 | AND |
bool.filter(Query.of(q -> q.range(...))) |
should |
满足更好 | 是 | OR |
bool.should(Query.of(q -> q.match(...))) |
mustNot |
必须不满足 | 否 | NOT |
bool.mustNot(Query.of(q -> q.term(...))) |
三、字段类型
| 字段类型 | 精确过滤 | 模糊 / 全文搜索 |
|---|---|---|
keyword |
term / terms | wildcard / prefix |
text |
- | match / multiMatch |
integer / double |
term / terms | range |
date |
range | - |
_id |
ids | - |
四、场景
| 场景 | 推荐Query | 原因 |
|---|---|---|
| 过滤条件(品牌/分类/状态) | term / terms + filter |
不评分,走缓存,最快 |
| 搜索框 | match |
分词,相关性排序 |
| 前缀联想 | prefix |
比 wildcard 快 |
| 包含匹配 | wildcard |
小数据量可用,大数据量慎用 |
| 价格 / 时间区间 | range |
专用结构,走索引 |
| 组合多条件 | bool |
唯一正确方式 |
| 删除 / 更新条件 | 任意组合 | 同搜索条件 |
五、完整示例
Query query = Query.of(q -> q
.bool(b -> b
// 过滤条件(不评分,走缓存)
.filter(f -> f.term(t -> t.field("brand").value("Apple")))
.filter(f -> f.range(r -> r.number(n -> n.field("price").gte(5000.0))))
// 搜索条件(参与评分)
.must(m -> m.match(mm -> mm.field("name").query("iPhone")))
// 或条件
.should(s -> s.term(t -> t.field("category").value("手机")))
.minimumShouldMatch("1") // should 至少匹配一个
// 排除条件
.mustNot(n -> n.term(t -> t.field("category").value("耳机")))
)
);
BoolQuery.Builder bool = new BoolQuery.Builder();
// AND 条件
bool.filter(Query.of(q -> q.term(t -> t.field("brand").value("Apple"))));
bool.filter(Query.of(q -> q.range(r -> r.number(n -> n.field("price").gte(5000.0)))));
// OR 条件
bool.should(Query.of(q -> q.match(m -> m.field("name").query("Pro"))));
bool.should(Query.of(q -> q.match(m -> m.field("name").query("Max"))));
bool.minimumShouldMatch("1"); // should 至少匹配一个
// NOT 条件
bool.mustNot(Query.of(q -> q.term(t -> t.field("category").value("耳机"))));
Query query = Query.of(q -> q.bool(bool.build()));