我的 flex 搜索的映射如下所示:
{
"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 regex documentation的意思是matching everything like .*
is very slow as well as using lookaround regular expressions(这是不明确的,而且是错误的,因为明智地使用环视方法可能会大大加快正则表达式的匹配)。
由于您要匹配包含f04
但不包含z
的任何字符串,因此您实际上可以使用
[^z]*fo4[^z]*
详细信息
[^z]*
-z
以外的任何0+个字符fo4
-fo4
子字符串[^z]*
-z
以外的任何0+个字符。 如果您有一个多字符字符串要“排除”(例如
z4
而不是z
),则可以使用complement operator来使用您的方法:.*f04.*&~(.*z4.*)
这意味着几乎相同,但不支持换行符:
.*
-除换行符以外的任何字符,尽可能多f04
-f04
.*
-除换行符以外的任何字符,尽可能多&
-AND ~(.*z4.*)
-除具有z4
的字符串以外的任何字符串关于regex - 负前瞻Regex在ES DSL查询中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51783196/