我有一个 flex 查询,如下所示:
GET /logs-of-year-2019.03.*/_search
{
"sort": [
{
"@timestamp": "desc"
}
],
"query": {
"bool": {
"must": [
{
"terms": {
"Request.advertiserId": [1695, 1252]
}
}
],
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-5h/d",
"lte": "now/d"
}
}
}
]
}
}
}
此查询获取所有
Request.advertiserId
为1695
或1252
的文档。使用@timestamp
过滤器。结果中包含
hits
存储桶,其中包含10
结果,其中包含1695
的一些结果和1252
的一些结果的组合。我要实现的是,对于每个指定的20
,我都需要n
(任何指定的Request.advertiserId
)文档。换句话说,20 documents
表示1695
,20
表示1252
。只需1个 flex 查询就可以实现吗?我现在可以想到的是对每个
Request.advertiserId
进行不同的查询并指定size=20
(这可以是n
变量)。但是然后我将不得不针对m
的m
编号触发Request.advertiserId
查询。可以在1个单一查询中实现吗?PS:
GET /logs-of-year-2019.03.*/_search
上面的行指出,需要扫描指定月份所有日期的日志。索引存储为logs-of-year-2019.03.01-05
(2019年3月1日为5th
小时的日志),logs-of-year-2019.03.01-06
(2019年3月1日为6th
hour的日志),依此类推。日志每天每小时创建一次。可以对上述行进行优化,使其从now
仅检查5个小时的索引(可以涉及前一天,因为搜索可以在晚上0100进行。因此,它应该比前一天花费21到00个小时,而从00到01个小时则需要(今天的日期)而不是整个月?
最佳答案
我想你可以做
GET /logs-of-year-2019.03.*/_search
{
"size":0
"sort": [
{
"@timestamp": "desc"
}
],
"query": {
"bool": {
"must": [
{
"terms": {
"Request.advertiserId": [1695, 1252]
}
}
],
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-5h/d",
"lte": "now/d"
}
}
}
]
}
},
"aggs": {
"byAdvertiser": {
"terms":{
"field":"Request.advertiserId"
},
"aggs":{
"by_top_hit":{"top_hits":{"size":10}}
}
}
}
}
关于elasticsearch - 获取elasticsearch中每个匹配项的 `n`记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512272/