Как построить поисковый запрос с фильтрацией для вложенных объектов в поиске spring-data elasti c? - PullRequest
0 голосов
/ 14 июля 2020

Мой документ похож на:

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 соответствует но поскольку Bar является объектом списка в Foo, Foo должен содержать только один объект Bar, идентификатор которого совпадает с идентификатором, предоставленным пользователем. Я использую NativeSearchQueryBuilder, предоставленный spring-data-elasticsearch как :

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

Ответ, который я получаю, состоит из всех Bar объектов независимо от Id, вот пример ответа:

[
    {
        "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 я получаю ответ, как указано выше. В ответе Bar должны содержаться только объекты с идентификатором 456, т.е. отправляемый в запросе идентификатор. Любые предложения будут полезны

1 Ответ

1 голос
/ 14 июля 2020

Вы запрашиваете Foo объекты, где существует Bar, который соответствует критериям, и Elasticsearch возвращает эти Foo s. Если вы хотите иметь только совпавшие Bar s, вам нужно добавить inner_hits к вашему запросу.

Отметьте этот вопрос и ответьте, как их получить, извлекая внутренние совпадения с Spring Data Elasticsearch будет поставляться с версией 4.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...