2016-08-24 113 views
0

我正在将Splunk查询翻译成Elasticsearch DSL。 我要检查,如果在日志中的URL中包含类似:如何正确使用elasticsearch正则表达式查询?

"script>" OR "UNION ALL SELECT" 

很公平我想,去了doc和:

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

Elasticsearch(2.3)回复:

“ROOT_CAUSE”:[{ “原因”: “无法解析搜索源未知搜索元素[正则表达式]。”, “吨ype“:”search_parse_exception“, ”line“:2,

请问有人能够启发我关于这类查询吗?

回答

2

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

但是,这还不足以实际发送查询。你错过了DSL的一个简单的包装一部分任何查询:

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

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

它具有mustmust_notshould,或filter并且每个接受查询(或过滤器,它们只是未得,可高速缓存的查询)的阵列。 should就像它的OR一样,但是当您将must与它一起添加时,请阅读它的行为方式的文档。要点是should本身就像OR(如下图所示),但如果将它与must结合使用,那么它将变得完全可选,而不使用"minimum_should_match": 1

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

我明白了。对困惑感到抱歉。这个查询似乎工作。如果你能告诉我如何对查询应用OR逻辑,那将是非常好的。尽管我的问题没有太明确。 – wishi

+0

你走了。我冒昧地将'regexp'改为'term',它假设**精确的**匹配行为。 – pickypg