使用正则表达式过滤器的Elasticsearch Bool查询

4

我一直在尝试找出在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"
  }
 }
}

正则表达式过滤器:

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    "
      },

1
Lucene的正则表达式默认是锚定的,并且^ / $在其中没有特殊意义。您不需要使用/正则表达式分隔符,也不需要转义/。尝试使用regexp_filter"https?://.*wp-(content|admin).*" - Wiktor Stribiżew
1个回答

3

Lucene的正则表达式默认是锚定的,^ / $在那里不是特殊字符。

你不需要/正则表达式分隔符,也不需要转义/

使用以下模式:

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

注意,我稍微修改了组来使模式更线性和高效。
详细信息:
- `https?://` - 字符串以 `https://` 或 `http://` 开始 - `.*` - 然后是任意 0+ 个字符 - `wp-` - 一个 `wp-` 子字符串 - `(content|admin)` - 要么是 `content` 要么是 `admin` 子字符串 - `.*` - 然后是任意 0+ 个字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接