Как искать внутри объекта вложенного списка в весенних загрузочных данных elasti c -search - PullRequest
1 голос
/ 22 января 2020

Класс модели моего контракта

@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;

Класс моего продукта

@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;
}

Используя данные пружины I, я пытаюсь получить данные на основе baseNumber, который присутствует в классе продукта. Но не удалось получить данные.
Я пытался использовать приведенный ниже метод JPA, но он не работает.

Optional<Contract>  findByProducts_BaseNumber(String s)

Я не совсем понимаю, как поддерживать соответствие между классом Contract и Product.

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Для меня ниже решение работает, я использую elasti c 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();

    }
0 голосов
/ 24 января 2020

Это должно быть

findByProductsBaseNumber(String s);

или

findByProducts_BaseNumber(String s);

, как описано в документации

...