使用Regexp过滤器的Elasticsearch Bool查询

时间:2017-06-05 19:59:20

标签: python regex elasticsearch

我一直试图找出在Elasticsearch 5.4查询中使用实际正则表达式模式的最佳方法。在搜索标准分析器并对每个字符串字段进行标记后,我开始使用放置在映射中的未分析字段(标准.raw属性)。我尝试过同一个查询的两个变体,但都没有成功。

查询字符串过滤器:

GET /test-*/_search
{
"query": {
  "bool": {
    "must": [
      {
          "query_string":{
            "query": "URL.raw:/^(http|https)\\:\/\/.+(wp-content|wp-admin)/"
          }  
      }
    ]
  }
},
"sort": {
  "@timestamp": {
    "order": "desc"
  }
 }
}

REGEXP FILTER:

GET /test-*/_search
{
 "query": {
  "bool": {
    "must": [
      {
        "regexp": {
          "URL.raw":{
            "value": "/^(http|https)\\:\/\/.+(wp-content|wp-admin)/"
          }
        }
      }
    ]
  }
 },
 "sort": {
  "@timestamp": {
    "order": "desc"
  }
 }
}

两者似乎都没有产生结果或解析异常

{
  "error": {
    "root_cause": [
      {
        "type": "parse_exception",
        "reason": "parse_exception: Encountered \" \"^\" \"^ \"\" at line 1, column 8.\nWas expecting one of:\n    <BAREOPER> ...\n    \"(\" ...\n    \"*\" ...\n    <QUOTED> ...\n    <TERM> ...\n    <PREFIXTERM> ...\n    <WILDTERM> ...\n    <REGEXPTERM> ...\n    \"[\" ...\n    \"{\" ...\n    <NUMBER> ...\n    "
      },

lucene是否需要特殊的转义或黑名单?任何帮助或指针将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

默认情况下,Lucene regexp是固定的,而^ / $并不特殊。

您不需要/正则表达式分隔符,因此您无需转义/

使用以下模式:

"value": "https?://.*wp-(content|admin).*"

请注意,我对组进行了一些修改,使图案更加线性和高效。

<强>详情:

  • https?:// - 字符串以https://http://
  • 开头
  • .* - 然后有任何0+字符
  • wp- - wp-子字符串
  • (content|admin) - contentadmin substring
  • .* - 然后有0个字符。