如何正确使用elasticsearch正则表达式查询?

时间:2016-08-24 16:25:21

标签: regex elasticsearch

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

"script>" OR "UNION ALL SELECT"

我认为很公平,去了doc,并且:

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

Elasticsearch(2.3)回复:

  

" root_cause":[         {           "原因":"无法解析搜索源。未知的搜索元素[regexp]",           "输入":" search_parse_exception",           " line":2,

有人可以告诉我这些问题吗?

1 个答案:

答案 0 :(得分:2)

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

但是,实际发送查询还不够。您为任何查询错过了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"
          }
        }
      ]
    }
  }
}