当前位置: 首页 > 知识库问答 >
问题:

仅从ElasticSearch Spring项目中的查询返回嵌套字段

郜俊晤
2023-03-14

我有以下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
}

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

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"));

但是如何直接检索嵌套的属性车?

共有1个答案

秦鹏飞
2023-03-14

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

第二种方法是正确的:取回人并从这些物体中取出汽车。

如果您喜欢使用流:

List<Car> cars = operations.search(query, Person.class, IndexCoordinates.of("person"))
    .stream().map(SearchHit::getContent)
    .flatMap(person -> person.getCar().stream())
    .collect(Collectors.toList());
 类似资料:
  • 我正在努力学习GraphQL( 我只得到一级字段,比如: 以下是我的模式: 我的解析器: 知道我做错了什么吗?

  • 是否可以使用spring data elasticsearch返回所有elasticsearch文档的特定嵌套字段? 例如。es数据存储库将如何查找以下查询? 网址: /myIndex/MyType/_search 查询正文:

  • 问题内容: 我有以下查询: 这将同时返回“匹配”对象(整个文档)和“ inner_hits”对象(嵌套在匹配内部)。 有没有办法让我只返回出现在“ inner_hits”结果中的匹配“查询”元素,而没有获取整个文档? 问题答案: 应该可以通过以下方式 在顶层 禁用source- field 来实现

  • 我是Elasticsearch的新手,我提出了一个问题,Elasticsearch嵌套查询是否只能为嵌套字段返回匹配的嵌套文档。 对于示例,我有一个名为的类型,其中嵌套字段名为 和嵌套查询 我需要的是搜索有提到足球的评论的博客文章,每个博客文章的评论数与足球相匹配(在例子中它数为1,因为另一个评论刚刚提到篮球)。 然而,Elasticsearch似乎总是返回完整的文档,所以我如何才能实现它,或者我

  • 注释使用Spring数据elasticsearch查询并仅返回特定的嵌套字段 版本: springboot:2.1.7。释放 spring数据弹性搜索:2.1.7。释放 elasticsearch:6.5.4 文件: 存储库: 我只想得到名字的数据,这样可以相对节省内存资源。但我犯了个错误,不能这样使用吗?或者只能使用elasticsearchTemplate?

  • 下面嵌套的ElasticSearch查询返回一些不应该命中的结果。许多结果不包含请求的订单号,但仍然列出了。我没有得到所有的文档,所以查询肯定会在某种程度上减少结果集。 查询结果(截断): 正如您所看到的,有一个点击(实际上,有相当多的点击)不应该出现,因为没有一个订单包含请求的订单号。 这是的映射: 最后,以下是澄清上述映射中所述的分析器的设置: