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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:25