gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:15:09 25 4
gpt4 key购买 nike

我的文档就像:

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匹配的 Bar对象。如:
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);
我得到的响应由所有 NativeSearchQueryBuilder对象组成,与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"
]
}
]
}
]
我尝试使用 Bar作为代码段中的注释,但是我没有得到响应,对于 termQuery,我得到了如上所述的响应。在响应中, matchQuery必须仅包含ID为456的对象,即在查询中发送的ID。任何建议都会有帮助

最佳答案

您正在查询Foo对象,其中存在一个与条件匹配的Bar,而Elasticsearch返回这些Foo。如果只想匹配Bar,则需要在查询中添加inner_hits。
检查this question并回答如何检索这些内容,使用Spring Data Elasticsearch检索内部匹配将随版本4.1一起提供。

关于spring-boot - 如何在spring-data Elasticsearch 中为嵌套对象过滤创建搜索查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62898467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com