我一直试图找出在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是否需要特殊的转义或黑名单?任何帮助或指针将不胜感激。谢谢!
答案 0 :(得分:2)
默认情况下,Lucene regexp是固定的,而^
/ $
并不特殊。
您不需要/
正则表达式分隔符,因此您无需转义/
。
使用以下模式:
"value": "https?://.*wp-(content|admin).*"
请注意,我对组进行了一些修改,使图案更加线性和高效。
<强>详情:
https?://
- 字符串以https://
或http://
.*
- 然后有任何0+字符wp-
- wp-
子字符串(content|admin)
- content
或admin
substring .*
- 然后有0个字符。