如何在 spring 启动数据弹性搜索中搜索嵌套列表对象

How to search inside nested list object in spring boot data elastic-search

我的合约模型class

@Data
@Document(indexName = "contract",type = "contract")
public class Contract implements Serializable
{
    @JsonProperty("contract_number")
    @Id
    @Parent(type = "p")
    @Field(type = FieldType.Text,index =true)
    private String contract_number;

    private String startDate;

    private String endDate;

    private String supportTypeCode;

    @Field(type = FieldType.Nested,searchAnalyzer = "true")
        private List<Product> products;

我的产品class

@Data
public class Product implements Serializable
{

    @Field(type = FieldType.Keyword)
    private String baseNumber;
    @Field(type = FieldType.Keyword)
    private String rowId;
    @Field(type = FieldType.Keyword)
    private String effectiveDate;
}

使用 spring 数据,我试图根据产品 class 中存在的 baseNumber 获取数据。 但是无法获取数据。
我尝试使用以下 JPA 方法,但它不起作用。

Optional<Contract>  findByProducts_BaseNumber(String s)

我很困惑如何维护合同和产品之间的映射class。

应该是

findByProductsBaseNumber(String s);

findByProducts_BaseNumber(String s);

documentation

中所述

对我来说,下面的解决方案有效我使用的是 elastic 7.6 版本 java API.

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("products.baseNumber", baseNumber);
    searchSourceBuilder.query(matchQueryBuilder);
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(5);
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices(INDEX);
    searchRequest.source(searchSourceBuilder);
    SearchHits hits = null;
    try
    {
        hits = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT).getHits();
        final List<Contract> collect = Arrays.stream(hits.getHits()).map(
                sourceAsMap -> objectMapper.convertValue(sourceAsMap.getSourceAsMap(), Contract.class)).collect(
                Collectors.toList());
        return  collect.get(0);
    }
    catch (IOException e)
    {
        e.printStackTrace();

    }