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()));