我有以下文件
{
"id": 1,
"store": "xyz",
"products": [
{
"object": {
"name": "chair",
"code": "2584"
},
"parts": [
{
"material": "wood"
},
{
"material": "steel"
}
]
}
]
},
{
"id": 2,
"store": "abc",
"products": [
{
"object": {
"name": "chair",
"code": "2584"
},
"parts": [
{
"material": "wood"
},
{
"material": "steel"
}
]
},
{
"object": {
"name": "table",
"code": "2678"
},
"parts": [
{
"material": "wood"
},
{
"material": "steel"
}
]
}
]
}
所以它是这样的:商店列表 - >产品清单 - >零件清单
现在我想查询所有在产品列表中拥有主席的商店,但我不希望在响应中包含所有产品
例如,商店“abc”应该返回查询:
{
"id": 2,
"store": "abc",
"products": [
{
"object": {
"name": "chair",
"code": "2584"
},
"parts": [
{
"material": "wood"
},
{
"material": "steel"
}
]
}
}
目前我的映射是:
"products.object": {
"type": "object",
"properties": {
"code": {
"type": "text",
"fielddata": true
},
"name": {
"type": "text",
"fielddata": true
}
}
},
"products.parts": {
"store": false,
"type": "long",
"index": false
},
我应该使用什么类型的查询以及应该如何进行映射?
提前谢谢
编辑:
要添加到我的问题,我的目标是删除所有与匹配数组中的查询不匹配的产品
因此响应应该包含id,变量“store”等等。但不是那些与“椅子”名称不匹配的产品(以回应我的例子)
答案 0 :(得分:0)
您可以使用条款聚合查询:
{
"size": 0,
"query": {
"bool": {
"must": {
"products.object.name": "chair"
}
}
},
"aggs": {
"stores_aggregation": {
"terms": {
"field": "store"
}
}
}
}
- > size:0确定不返回任何文件。
- >查询将仅按主席
过滤- >聚合将为您提供包含所有相关商店的存储桶列表,请查看here以获取更多信息。
另一件事,我建议您与Nested Datatype进行嵌套,请参阅我的回答here以了解其中的好处。