如何在spring-data弹性搜索中为嵌套对象过滤创建搜索查询?

时间:2020-07-14 15:20:04

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

我的文档就像:

class Foo{
 private Integer idDl;
 private String Name;
 private String Add;
 @Field(type = FieldType.Nested)
 private List< Bar> Bar;
 }
 
 class Bar{
 private Integer barId;
 private List<String> barData
 }

Foo示例数据如下:

{
    "idDl": 123,
    "Name": "ABCD",
    "Add": "FL",
    "Bar": [
        {
            "barId": 456,
            "barData": [
                "Bar1",
                "Bar2"
            ]
        },
        {
            "barId": 985,
            "barData": [
                "Bar4",
                "Bar5"
            ]
        }
    ]
}

我想返回Foo匹配的所有Bar.barId对象,但由于BarFoo中的列表对象,因此Foo仅包含一个{ ID为{1}}的对象与用户提供的ID相匹配。我正在使用spring-data-elasticsearch提供的Bar作为

NativeSearchQueryBuilder

我得到的响应由所有String[] includeFields = new String[]{"idDl", "Name"}; String[] excludeFields = new String[]{"Add"}; // to exclude Add field of Foo Query searchQuery = new NativeSearchQueryBuilder() .withQuery(matchQuery("Bar.barId", 456)) //.withQuery(termQuery("Bar.barId", 456)) .withSourceFilter(new FetchSourceFilter(includeFields, excludeFields)) .build(); return elasticsearchRestTemplate.queryForList( searchQuery, Foo.class); 对象组成,与ID无关,这是示例响应:

Bar

我尝试使用摘录中的[ { "idDl": 123, "Name": "ABCD", "Add": "FL", "Bar": [ { "barId": 456, "barData": [ "Bar1", "Bar2" ] }, { "barId": 985, "barData": [ "Bar4", "Bar5" ] } ] }, { "idDl": 758, "Name": "PQR", "Add": "NY", "Bar": [ { "barId": 456, "barData": [ "Bar1", "Bar2" ] }, { "barId": 671, "barData": [ "Bar24", "Bar25" ] } ] } ] ,但我没有得到回应,而termQuery则得到了如上所述的回应。在响应中,{matchQuery必须仅包含ID为456的对象,即在查询中发送的ID。任何建议都会有帮助

1 个答案:

答案 0 :(得分:1)

您要查询的Foo对象中是否存在符合条件的Bar,Elasticsearch返回这些Foo。如果只想匹配Bar个,则需要在查询中添加inner_hits。

检查this question并回答如何检索这些内容,使用Spring Data Elasticsearch检索内部匹配将随版本4.1一起提供。