如何在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,提问作者Максим
相关产品推荐
相关产品推荐

