负前瞻Regexp在ES DSL查询中不起作用

我的elasticsearch的映射如下所示:

{

"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查询。当我的查询包含任何复杂的正则表达式时,它在大多数情况下都可以正常工作。但是,如果它包含正则表达式字符“!”,则它将完全失败。在里面。当搜索词包含“!”时,不会给出任何结果

在里面。

例如:

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”:“关键字”以及“ type”:“关键字”,但是在这种情况下,没有任何效果。

在浏览器中,我尝试检查Analyzer:keyword如何在输入失败的情况下对输入起作用:

http:// localhost:9210 / search / _analyze?analyzer = keyword&text =

f04((?!z)。)

*

看起来看起来不错,结果如下:

{

"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正则表达式的文件是比较模糊的说法

匹配一切都像.*很慢,以及使用环视正则表达式(这不仅暧昧,而且还错误的,因为lookarounds,明智地使用时,可以大大加快正则表达式匹配)。

由于您要匹配包含f04和不包含的任何字符串z,因此您实际上可以使用

[^z]*fo4[^z]*

  • [^z]* -除0以外的任何其他字符 z
  • fo4- fo4子串
  • [^z]*-除以外的任何0+个字符z

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

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

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

  • .* -尽可能使用除换行符以外的任何字符
  • f04 -- f04
  • .* -尽可能使用除换行符以外的任何字符
  • & -和
  • ~(.*z4.*) -除具有 z4

以上是 负前瞻Regexp在ES DSL查询中不起作用 的全部内容, 来源链接: utcz.com/qa/398911.html

回到顶部