【问题标题】:How to use the elasticsearch regex query correctly?如何正确使用 elasticsearch 正则表达式查询?
【发布时间】:2016-08-24 16:25:20
【问题描述】:

我正在将 Splunk 查询转换为 Elasticsearch DSL。 我想检查日志中的 URL 是否包含以下内容:

"script>" OR "UNION ALL SELECT"

我觉得还不错,去了doc,然后:

{
  "regexp": {
    "http.url": "script>"
  }
}

Elasticsearch (2.3) 回复:

“根本原因”:[ { "reason": "无法解析搜索源。未知搜索元素 [regexp]", "type": "search_parse_exception", “行”:2,

有人能告诉我这些问题吗?

【问题讨论】:

    标签: regex elasticsearch


    【解决方案1】:

    从文档开始时,这是一个非常简单的错误。在文档中,我们通常只显示原始查询(及其参数)。查询是复合查询或叶查询。 regexp 是叶查询的示例。

    但是,这还不足以真正发送查询。您缺少 any 查询的 DSL 的简单包装部分:

    {
      "query": {
        "regexp": {
          "http.url": "script>"
        }
      }
    }
    

    要使用复合查询,最好的方法是使用bool compound query

    它有mustmust_notshouldfilter,每个都接受一组查询(或过滤器,它们只是无分数、可缓存的查询)。 should 是它的类似 OR 的方面,但请阅读文档,了解当您在其旁边添加 must 时它的行为方式。要点是,should 本身与OR 完全一样(如下所示),但如果将其与must 结合使用,则在不使用"minimum_should_match": 1 的情况下它变得完全可选。

    {
      "query": {
        "bool": {
          "should": [
            {
              "term": {
                "http.url": "script>"
              }
            },
            {
              "term": {
                "http.url": "UNION ALL SELECT"
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 我现在明白了。对困惑感到抱歉。这个查询似乎有效。如果您能告诉我如何将 OR 逻辑也应用于查询,那就太好了。不过,我的问题并没有说得太清楚。
    • 你去。我冒昧地将regexp 更改为term,它假定精确 匹配行为。
    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多