Мой документ похож на:
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, т.е. отправляемый в запросе идентификатор. Любые предложения будут полезны