弹性搜索通配符查询崩溃群集

时间:2018-02-14 05:41:05

标签: elasticsearch

我在大型弹性搜索群集上运行以下查询。群集没有反应

{
  "size": 10000,
  "query": {
    "bool": {
      "must": [
        {
          "regexp": {
            "message": {
              "value": ".*exception.*"
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "beat.hostname": "ip-xxx-xx-xx-xx"
                }
              }
            ]
          }
        },
        {
          "range": {
            "@timestamp": {
              "lt": 1518459660000,
              "format": "epoch_millis",
              "gte": 1518459600000
            }
          }
        }
      ]
    }
  }
}

当我删除通配符.*exception.*并将其替换为任何非通配字符串(如xyz)时,它会快速返回。虽然查询使用通配符表达式,但它也会查找较小的时间范围和特定主机。我认为这是一个非常简单的查询。弹性搜索服务器无法处理此查询的任何原因?该集群有10个节点和20 TB的数据。

1 个答案:

答案 0 :(得分:0)

请参阅documentation for Regexp Query。它清楚地说明了以下内容:

  

注意:正则表达式查询的性能很大程度上取决于常规   表达式选择。匹配像。*这样的一切非常慢

最理想的是使用WordDelimiterTokenFilter更改message字段的文本分析,并将split_on_case_change设置为true。然后NullPointerException之类的内容将被编入索引为三个单独的标记[Null, Pointer, Exception]。这可以帮助您在不使用正则表达式的情况下搜索exception。警告你需要重新索引所有文件。

另一个快速尝试的方法可能是将过滤条件保留在filter context中的主机名和时间戳上,这将在运行regexp查询之前预先过滤文档。在您修复文本分析之前,这可能是一个短期解决方案。