【问题标题】:Return only nested field from query in ElasticSearch Spring project从 ElasticSearch Spring 项目中的查询中仅返回嵌套字段
【发布时间】:2021-07-13 17:58:50
【问题描述】:

我有以下 POJO

@Document(indexName = "person", type = "user")
public class Person {

    @Id
    private String id;

    @Field(type = FieldType.String)
    private String name;

    @Field(type = FieldType.Nested)
    private List<Car> car;

// getter/setter

}
public class Car {

    @Field(type = FieldType.String)
    private String name;

    @Field(type = FieldType.String)
    private String model;

// getter/setter
}

在下面的类中,我想直接为给定的人检索嵌套字段“汽车”,名称作为参数传递,但它返回一个空值列表。

public class ElasticsearchRepo {

    private ElasticsearchOperations op;

    public List<Car> getCars(String name) {
        String[] includeFields = new String[]{"car"};
        String[] excludeFields = null;

        NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("name", name))
            .withSourceFilter(new FetchSourceFilter(includeFields, excludeFields)).build();

        SearchHits<Car> searchHits = op.search(query, Car.class, IndexCoordinates.of("person"));

        return customerSearchHits.getSearchHits().stream().map(s -> s.getContent().getCars())
            .collect(Collectors.toList());
    }

但是,如果在上面的 searchHits 代码中我将类更改为 Person,如下所示,我将返回 pojo Person,其中属性“cars”是唯一填写的属性(所有其他属性都检索为 null):

 SearchHits<Person> searchHits = op
            .search(query, Person.class, IndexCoordinates.of("person"));

但是我怎样才能直接检索嵌套的属性汽车?

【问题讨论】:

    标签: java elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    查询 person 索引时,Elasticsearch 将返回 Person 文档 - 仅包含您在 sourcefilter 中定义的字段。 Spring Data Elasticsearch 将这些文档映射到给定的实体。但它不能将具有 car 属性的源文档映射到具有 namemodel 属性的类。这就是为什么在您的第一种情况下,返回的人员被映射到空对象。

    第二种方法是正确的:检索人员并从这些对象中提取汽车。

    如果你喜欢用流来做:

    List<Car> cars = operations.search(query, Person.class, IndexCoordinates.of("person"))
        .stream().map(SearchHit::getContent)
        .flatMap(person -> person.getCar().stream())
        .collect(Collectors.toList());
    

    【讨论】:

    • 感谢您的反馈,因此在 ElasticSearchRepositories 中,我们无法像在 JPARepositories 中那样使用投影,例如,我们可以在其中进行查询并返回由 pojo 表示的实体的特定属性?
    • 1. Spring Data Elasticsearch 不支持投影。 2. Spring Data JPA 中的投影或例如 Spring Data MongoDB 项目属性的根实体 (Person) - 例如具有 List&lt;Car&gt; car 属性的 CarOnly 实体。您希望投影到一个具有与根实体不同的属性的类。
    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多