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

回到顶部