【问题标题】:elasticsearch getting too many results, need help filtering queryelasticsearch 得到太多结果,需要帮助过滤查询
【发布时间】:2014-12-05 20:46:02
【问题描述】:

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

我想过滤数据以获得正确的结果,任何帮助将不胜感激!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我找到了一个解决方案,这有点奇怪。 我已按照 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 应该得到最好的答案,但是向你们两个竖起大拇指:)

    【讨论】:

    • 我想出了另一个更简洁的解决方案,我会在测试完成后通知您
    • Alexandre Mélard 您的清洁剂解决方案是什么?
    • 对不起,我没有更多的时间,我不得不把这个话题放在一边,但我会尽快发布一些东西
    • 我的问题很相似,但只是运行清除缓存发布请求解决了我的问题。谢谢!
    【解决方案2】:

    您可以先尝试清除缓存,然后执行上述查询,如here所示。

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

    我最好的选择是先清除缓存,或者为elasticsearch分配更多内存(更多here

    【讨论】:

      【解决方案3】:

      使用过滤器可以提高性能:

      {
        "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 字段中有很多基数吗?您是否尝试过对值进行预散列?

      【讨论】:

      • 执行查询时,我得到一个 SearchPhaseExecutionException
      • 我已经在我的 ES 上插入了 kibana,以查看它是否可以对我的数据执行某些操作,但也失败并出现相同的错误:数据太大,字段 [@timestamp] 的数据会大于[3200306380/2.9gb]]的限制
      • 您希望查询返回多少结果?您的数据有什么级别的基数?
      • 我为数据库中存储的每条记录设置一个时间戳(每天 50Go)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2018-08-15
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多