我的日志有多种类型。每种日志类型都有按日期组织的多个索引。日志类型共享相似的字段(这意味着我可以在多个日志类型+指示上运行单个查询来过滤掉结果)。我想通过“日志类型”得到与某些标准组匹配的计数。
解决此问题的一种方法是并行运行多个查询。每个查询都像普通的_search查询一样,在单个log_type上使用过滤条件。然后我们可以返回_count。但它需要运行多个查询 - 多次往返。
是否有更好的方法只在单个查询中获得结果。
- 下面是我的简化映射 -
"logstash-2017.01.09": {
"mappings": {
"typeA": {
"properties": {
"IP": {
"type": "ip",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"COUNTRY": {
"type": "string",
"norms": {
"enabled": false
},
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
},
"typeB": {
"properties": {
"IP": {
"type": "ip",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"COUNTRY": {
"type": "string",
"norms": {
"enabled": false
},
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
有多个索引,例如logstash-(按日期组织)。我想为日志匹配条件找到COUNT(按日志类型分组),例如country ='US';
样本响应应该是这样的:
{ typeA:30000, typeB:50000 }
或者有30000个类型A的记录匹配'country = US';等...
我正在使用elasticsearch nodejs客户端。以下是我的尝试:
elasticClient.search({
index: indices.join(","), //['logstash-2017.01.09', 'logstash-2017.01.10'] -- all indices within time interval
type: logTypes.join(","), //['typeA'] -- run for each type separatedly and in parallel
body: {
"query": {
"filtered":{
"query": {
"query_string" : {
"query": 'COUNTRY:"US"' // example only
}
},
"filter": {
"range" : {
"@timestamp" : {
"from" : startIso,
"to" : endIso
}
}
}
}
},
"from" : 0,
"size" : 0
}
})