【问题标题】:Elastic search wildcard query crashes cluster弹性搜索通配符查询使集群崩溃
【发布时间】:2018-02-14 05:41:04
【问题描述】:

我在一个大型弹性搜索集群上运行以下查询。集群无响应

{
  "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 的数据。

【问题讨论】:

  • 你试过.*?exception.*吗?它应该更有效(和你想要的一样)。
  • 谢谢@GáborBakos 我会试试的。除此之外,您是否发现查询有任何问题
  • ` .*?exception.*? ` 并没有更好。

标签: elasticsearch


【解决方案1】:

请参阅documentation for Regexp Query。它明确指出以下内容:

注意:正则表达式查询的性能在很大程度上取决于正则表达式 选择的表达。匹配 .* 之类的所有内容都非常慢

理想的做法是使用WordDelimiterTokenFilter 更改message 字段上的文本分析,并将split_on_case_change 设置为true。然后像NullPointerException 这样的东西将被索引为三个单独的标记[Null, Pointer, Exception]。这可以帮助您在不使用正则表达式的情况下搜索 exception。需要注意的是,您需要重新索引所有文档。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多