负向先行正则表达式在 ES dsl 查询中不起作用

2023-12-01

我的 Elastic 搜索的映射如下所示:

{
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "node": {
      "properties": {
        "field1": {
          "type": "keyword"
        },
        "field2": {
          "type": "keyword"
        },
        "query": {
          "properties": {
            "regexp": {
              "properties": {
                "field1": {
                  "type": "keyword"
                },
                "field2": {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
  }
}

问题是:

我正在使用 elasticsearch_dsl Q() 形成 ES 查询。当我的查询包含任何复杂的正则表达式时,它在大多数情况下都可以正常工作。但如果它包含正则表达式字符“!”,则完全失败在里面。当搜索词包含“!”时,它不会给出任何结果在里面。

For eg:

1.) Q('regexp', field1 = "^[a-z]{3}.b.*")(完美运作)

2.) Q('regexp', field1 = "^f04.*")(完美运作)

3.)Q('regexp', field1 = "f00.*")(完美运作)

4.) Q('regexp', field1 = "f04baz?")(完美运作)

在以下情况下失败:

5.) Q('regexp', field1 = "f04((?!z).)*")(失败,没有任何结果)

我尝试在字段中添加“analyzer”:“keyword”以及“type”:“keyword”,但在这种情况下没有任何效果。

在浏览器中,我尝试检查分析器:关键字在失败的情况下如何处理输入:

*

结果看起来不错:

{
  "tokens": [
    {
      "token": "f04((?!z).)*",
      "start_offset": 0,
      "end_offset": 12,
      "type": "word",
      "position": 0
    }
  ]
}

我正在运行我的查询,如下所示:

search_obj = Search(using = _conn, index = _index, doc_type = _type).query(Q('regexp', field1 = "f04baz?"))
count = search_obj.count()
response = search_obj[0:count].execute()
logger.debug("total nodes(hits):" + " " + str(response.hits.total))

请帮忙,这确实是一个烦人的问题,因为所有正则表达式字符在除 ! 之外的所有查询中都可以正常工作。

另外,我如何检查映射中当前应用了上述设置的分析器?


ElasticSearch Lucene 正则表达式引擎不支持任何类型的环视。这ES 正则表达式文档是相当模棱两可的说法匹配一切像.*和使用环视正则表达式一样非常慢(这不仅不明确,而且是错误的,因为明智地使用环视可以大大加快正则表达式匹配速度)。

因为您想匹配包含以下内容的任何字符串f04并且不包含z,你实际上可以使用

[^z]*fo4[^z]*

Details

  • [^z]*- 除 0 个以上字符外z
  • fo4 - fo4子串
  • [^z]*- 除 0 个以上字符外z.

如果您有一个多字符字符串要“排除”(例如,z4而不是z),您可以使用您的方法补码运算符:

.*f04.*&~(.*z4.*)

这意味着几乎相同但不支持换行:

  • .*- 除了换行符之外的任何字符,尽可能多
  • f04 - f04
  • .*- 除了换行符之外的任何字符,尽可能多
  • & - AND
  • ~(.*z4.*)- 除了具有以下特征的字符串之外的任何字符串z4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

负向先行正则表达式在 ES dsl 查询中不起作用 的相关文章

随机推荐