我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press-release-1。为了尝试正确使用我现在使用的正则表达式match_all
,但这最终将match_phrase
与用户的查询字符串一起使用。
POST到localhost:9200 / _search
{
"query" : {
"match_all" : { },
"filtered" : {
"filter" : {
"regexp": {
"url":".*info-for/media.*"
}
}
}
},
}
这将返回0次匹配,但可以正确解析。.*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
。那是性能更高的过滤器,也可以缓存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句