如何将Postman中正常运行的Elasticsearch查询转为Spring Boot Data 8.x实现?
Spring Boot Data Elasticsearch 8.x 实现等效查询
1. 定义实体类
先对应Elasticsearch的文档结构,分别定义主实体和嵌套实体:
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.Nested; import java.util.List; @Document(indexName = "你的索引名") // 替换成实际使用的索引名称 public class Sample { @Field(name = "sample_id") private String sampleId; @Field(name = "data_type") private String dataType; @Field(name = "cancer_code") private String cancerCode; @Nested @Field(name = "expressions", type = FieldType.Nested) private List<Expression> expressions; // 主文档查询会排除该字段,inner hits将单独返回匹配结果 // 省略getter、setter、构造方法 } // 嵌套字段对应的实体类 class Expression { private String key; private Double value; // 根据实际数据类型调整,比如Integer或String // 省略getter、setter、构造方法 }
2. 构建并执行查询
使用NativeSearchQueryBuilder构建与原JSON完全等效的查询,再通过ElasticsearchOperations执行:
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.FetchSourceFilter; import java.util.List; // 注入ElasticsearchOperations实例 private final ElasticsearchOperations elasticsearchOperations; // 查询方法 public List<Sample> getSamplesWithSMU1Expression() { NativeSearchQuery query = new NativeSearchQueryBuilder() // 配置_source过滤:包含指定字段,排除expressions .withSourceFilter(new FetchSourceFilter( new String[]{"sample_id", "data_type", "cancer_code"}, new String[]{"expressions"} )) // 构建nested查询 .withQuery(query -> query.nested(nested -> nested .path("expressions") // 配置inner_hits的返回字段 .innerHits(innerHits -> innerHits .source(source -> source.includes("expressions.key", "expressions.value")) ) // 嵌套内的match查询 .query(nestedQuery -> nestedQuery.match(match -> match .field("expressions.key") .query("SMU1") )) )) .build(); SearchHits<Sample> searchHits = elasticsearchOperations.search(query, Sample.class); // 如果需要处理inner hits的匹配结果,可遍历SearchHit获取 for (SearchHit<Sample> hit : searchHits) { var innerHitResults = hit.getInnerHits().get("expressions"); if (innerHitResults != null) { List<Expression> matchedExpressions = innerHitResults.getSearchHits().stream() .map(SearchHit::getContent) .toList(); // 可将匹配到的嵌套数据关联到对应的Sample对象上 } } return searchHits.getSearchHits().stream() .map(SearchHit::getContent) .toList(); }
关键匹配点说明
FetchSourceFilter完全对应原查询的_source配置,精准控制主文档返回字段。- Nested查询的
path、innerHits的source配置、内部match查询,一一对应原JSON查询的各个节点。 - 执行后
SearchHit的getInnerHits()方法可获取到与Postman返回一致的嵌套匹配结果。
内容的提问来源于stack exchange,提问作者Miguel Angel Salinas Gancedo
相关产品推荐
相关产品推荐

