我使用下面的弹性搜索查询并获取响应,但如何限制查询中指定的每个 itemDetails.itemId 的响应大小。
弹性搜索版本:8.7.1
示例弹性搜索文档:
{
"itemDetails": {
"itemId": "3076",
"usecase": "habc",
"usecaseId": "xyz"
},
"metaData": {
"cId": "96ff54507c2d018e5c767785c705a5b2",
"date1": "2023-09-29T12:29:54",
"date2": "2023-09-29T12:30:09"
}
other properties....
}
输入查询:
POST /index/_search?typed_keys=true
{
"size": 0,
"query": {
"bool": {
"must": [
{
"terms": {
"itemDetails.itemId": [
"3076",
"1111",
"2222"
]
}
},
{
"terms": {
"itemDetails.usecase": [
"habc"
]
}
},
{
"range": {
"metaData.date1": {
"lte": "2023-09-30T19:55:54.611Z",
"gte": "2023-09-27T19:55:54.611Z"
}
}
}
]
}
},
"aggs": {
"distinct_cIds": {
"terms": {
"field": "metaData.cId"
"order": { "max_date1": "desc" }
},
"aggs": {
"max_date1": {
"max": { "field": "metaData.date1" }
},
"top_doc": {
"top_hits": {
"size": 1,
"sort": [
{"metaData.date1": "desc"},
{"metaData.date2": "desc"}
],
"_source": {
"includes": [
"itemDetails.itemId",
"itemDetails.usecase",
"metaData.cId",
"metaData.date1"
]
}
}
}
}
}
}
}
预期结果:如果大小为2,响应应包含每个itemDetails.itemId 2条记录
参考问题::此查询是参考问题的延续
如果希望每个
itemId
有两个结果,则需要为terms
字段添加另一个itemDetails.itemId
子聚合,如下所示:
POST /index/_search?typed_keys=true
{
"size": 0,
"query": {
"bool": {
"must": [
{
"terms": {
"itemDetails.itemId": [
"3076",
"1111",
"2222"
]
}
},
{
"terms": {
"itemDetails.usecase": [
"habc"
]
}
},
{
"range": {
"metaData.date1": {
"lte": "2023-09-30T19:55:54.611Z",
"gte": "2023-09-27T19:55:54.611Z"
}
}
}
]
}
},
"aggs": {
"distinct_cIds": {
"terms": {
"field": "metaData.cId",
"order": {
"max_date1": "desc"
}
},
"aggs": {
"max_date1": {
"max": {
"field": "metaData.date1"
}
},
"distinct_itemId": {
"terms": {
"field": "itemDetails.itemId"
},
"aggs": {
"top_doc": {
"top_hits": {
"size": 2,
"sort": [
{
"metaData.date1": "desc"
},
{
"metaData.date2": "desc"
}
],
"_source": {
"includes": [
"itemDetails.itemId",
"itemDetails.usecase",
"metaData.cId",
"metaData.date1"
]
}
}
}
}
}
}
}
}
}