【问题标题】:Get all non-full fields in Spring Data Elasticsearch Query using source filtering使用源过滤获取 Spring Data Elasticsearch Query 中的所有非完整字段
【发布时间】:2020-10-24 07:26:53
【问题描述】:

我们使用原生搜索查询生成器如下:

 String[] includeFields = new String[]{"idDl", "clientName"};
 String[] excludeFields = new String[]{"Address"};
 Query searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchAllQuery())
                .withSourceFilter(new FetchSourceFilter(includeFields, excludeFields))
                 .build();
return elasticsearchRestTemplate.queryForObject((StringQuery) searchQuery, User.class);

我能够获取所有响应数据,但第一个响应对象都是空字段,我想在最终响应中排除所有空字段对象。我们正在使用我们正在使用 spring-data-elasticsearch 3.2.6.RELEASE,这是示例响应:

   [{
        "idDl": null,
        "clientName": null,
        "Address": null
    },
    {
        "idDl": 19810008,
        "clientName": "ABC",
        "Address": "NYC"
        
    }]

【问题讨论】:

    标签: spring-boot elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    您应该做的是创建一个查询,该查询将排除具有空值字段的文档,而不是执行match_all。用这个来改变你的查询:

                ...
                .withQuery(existsQuery("idDl"))
                ...
    

    另外值得注意的是,单独的源过滤不会查看字段的值来检查它们是否为空,如果它存在于源文档中,它只会按名称返回字段。

    【讨论】:

    • 嗨@val,如果我进行了这样的更改,那么 ElasticsearchRepository 的 findAll() 也会受到影响,它还将第一个对象作为所有空字段返回,我只是希望它返回所有具有非空字段,这是预期的行为,我需要进行任何更改吗?我已经为它发布了单独的问题,请您回答stackoverflow.com/questions/62771342/…
    • 嗨@val,我只是想知道这个自定义字段过滤方法是否干扰了 ElasticsearchRepository 的 findAll() 方法的实现,正如之前评论中所要求的那样。任何建议都会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2015-10-19
    • 2016-09-07
    相关资源
    最近更新 更多