elasticsearch得到的结果太多,需要帮助过滤查询

时间:2014-12-04 14:20:14

标签: elasticsearch

我很难理解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"
          }
        }
      }
    }
  }
}

我想过滤数据以便能够获得正确的结果,非常感谢任何帮助!

3 个答案:

答案 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)

您可以先尝试清除缓存,然后执行上面的查询here

另一种解决方案可能是删除查询中的间隔或减少时间范围...

我最好的选择是首先清除缓存,或者为弹性搜索分配更多内存(更多here

答案 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字段中有很多基数?你有没有试过预先散列值?