ElasticSearch正则表达式过滤器
我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for /
media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press-
release-1。为了尝试正确使用我现在使用的正则表达式match_all
,但这最终将match_phrase
与用户的查询字符串一起使用。
{"query" : {
"match_all" : { },
"filtered" : {
"filter" : {
"regexp": {
"url":".*info-for/media.*"
}
}
}
},
}
这将返回
,但可以正确解析。.*info.*
确实会获得包含该URL的结果,但不幸的是它太宽泛,例如匹配包含“信息”的任何URL。一旦在“ info-
for”中添加连字符,我将再次得到0结果。无论我尝试使用哪种转义字符组合,我都会遇到解析异常或没有匹配项。有人可以帮我解释我做错了吗?
回答:
首先,尽可能尝试不要使用没有前缀的正则表达式或通配符。搜索的方式.*foo.*
是将索引字典中的每个单个词与模式进行匹配,该模式又被构建为匹配项的OR查询。语料库中唯一词的数量为
O(n) ,随后的搜索也非常昂贵。
本文对此有更多详细信息:https : //www.found.no/foundation/elasticsearch-from-the-bottom-
up/
其次,您的url可能以使“ info-for”和“ media”在索引中分开的方式进行标记。因此,info-
for/media字典中没有用于匹配正则表达式的-term。
您可能想做的是使用path_hierarchy -tokenizer 分别索引路径和域,以生成术语。
这是一个演示令牌生成方式的示例:https
:
//www.found.no/play/gist/ecf511d4102a806f350b#analysis
即/foo/bar/baz
生成令牌/foo/bar/baz, /foo/bar,
/foo并将域令牌foo.example.com
化为foo.example.com, example.com, com
在下面搜索任何内容都/foo/bar
可以是一个简单的术语过滤器匹配path:/foo/bar
。那是性能更高的筛选器,也可以缓存。
以上是 ElasticSearch正则表达式过滤器 的全部内容, 来源链接: utcz.com/qa/427415.html