You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Data Elasticsearch的Criteria中使用正则表达式?

Spring Data Elasticsearch 复杂查询实现方案

方案1:基于Criteria类实现

Criteria本身内置了正则查询的支持,直接调用regex()方法即可实现你的需求,代码示例如下:

import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import jakarta.annotation.Resource;

// 构造查询条件
Criteria criteria = Criteria.where("field1").is("string1")
        .and("field2").is("string2")
        .and(
                // 嵌套OR条件
                new Criteria().or(
                        Criteria.where("field3").regex("regex3"),
                        Criteria.where("field4").regex("regex4")
                )
        );

// 构建查询对象
CriteriaQuery query = new CriteriaQuery(criteria);
// 执行查询,YourDoc为你对应ES索引的实体类
var result = elasticsearchOperations.search(query, YourDoc.class);

注意:ES正则查询默认使用Lucene正则语法,不需要额外加前后/分隔符,不要直接套用Java正则的写法。

方案2:基于NativeSearchQuery实现(更推荐复杂场景)

如果后续查询规则会持续迭代变复杂,建议直接使用原生查询构造器,灵活度更高,代码示例如下:

import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import jakarta.annotation.Resource;

import static co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders.*;

// 构造原生DSL查询
Query esQuery = bool(b -> b
        // 两个等值must条件
        .must(match(m -> m.field("field1").query("string1")))
        .must(match(m -> m.field("field2").query("string2")))
        // OR条件放在should里,要求最少匹配1条
        .should(s -> s.regexp(r -> r.field("field3").value("regex3")))
        .should(s -> s.regexp(r -> r.field("field4").value("regex4")))
        .minimumShouldMatch("1")
);

NativeSearchQuery query = new NativeSearchQueryBuilder()
        .withQuery(esQuery)
        .build();
// 执行查询
var result = elasticsearchOperations.search(query, YourDoc.class);

性能优化提示

  • 正则查询性能偏低,不适合高频、大数据量查询场景,如果匹配规则固定,建议提前对字段做预处理(比如新增预处理标签字段)优化查询效率
  • 如果是字段精确匹配场景,优先使用term查询,不要用正则,性能差距可达数十倍

内容的提问来源于stack exchange,提问作者Максим

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:45:11