我很难理解ES查询系统的基础。
例如,我有以下查询:
{
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"referer": "www.xx.yy.com"
}
},
{
"range": {
"@timestamp": {
"gte": "now",
"lt": "now-1h"
}
}
}
]
}
},
"aggs": {
"interval": {
"date_histogram": {
"field": "@timestamp",
"interval": "0.5h"
},
"aggs": {
"what": {
"cardinality": {
"field": "host"
}
}
}
}
}
}
该请求得到的结果太多了:
"状态" :500,"原因" : " ElasticsearchException [org.elasticsearch.common.breaker.CircuitBreakingException: 数据太大,字段[@timestamp]的数据将大于限制 [3200306380 / 2.9gb]];嵌套: UncheckedExecutionException [org.elasticsearch.common.breaker.CircuitBreakingException: 数据太大,字段[@timestamp]的数据将大于限制 [3200306380 / 2.9gb]];嵌套:CircuitBreakingException [数据也是 大的,字段[@timestamp]的数据将大于限制 [3200306380 / 2.9GB]]; "
我已尝试过该请求:
{
"size": 0,
"filter": {
"and": [
{
"term": {
"referer": "www.geoportail.gouv.fr"
}
},
{
"range": {
"@timestamp": {
"from": "2014-10-04",
"to": "2014-10-05"
}
}
}
]
},
"aggs": {
"interval": {
"date_histogram": {
"field": "@timestamp",
"interval": "0.5h"
},
"aggs": {
"what": {
"cardinality": {
"field": "host"
}
}
}
}
}
}
我想过滤数据以便能够获得正确的结果,非常感谢任何帮助!
答案 0 :(得分:12)
我找到了一个解决方案,这有点奇怪。 我跟着dimzak建议并清除缓存:
curl --noproxy localhost -XPOST "http://localhost:9200/_cache/clear"
然后我使用过滤而不是查询Olly建议:
{
"size": 0,
"query": {
"filtered": {
"query": {
"term": {
"referer": "www.xx.yy.fr"
}
},
"filter" : {
"range": {
"@timestamp": {
"from": "2014-10-04T00:00",
"to": "2014-10-05T00:00"
}
}
}
}
},
"aggs": {
"interval": {
"date_histogram": {
"field": "@timestamp",
"interval": "0.5h"
},
"aggs": {
"what": {
"cardinality": {
"field": "host"
}
}
}
}
}
}
我不能同时给你两个回答,我认为dimzak应该得到最好的,但是对你们两个赞不绝口。)
答案 1 :(得分:6)
答案 2 :(得分:4)
使用过滤器可以提高性能:
{
"size": 0,
"query": {
"filtered": {
"query": {
"term": {
"referer": "www.xx.yy.com"
}
},
"filter" : {"range": {
"@timestamp": { "gte": "now", "lt": "now-1h"
}
}
}
}
},
"aggs": {
"interval": {
"date_histogram": {
"field": "@timestamp",
"interval": "0.5h"
},
"aggs": {
"what": {
"cardinality": {
"field": "host"
}
}
}
}
}
}
您可能还会发现date range比日期直方图更好 - 您需要自己定义存储桶。
是否正在分析referer
字段?或者你想要一个完全匹配 - 如果这样设置为 not_analyzed 。
你的hostname
字段中有很多基数?你有没有试过预先散列值?