ElasticSearch Regexp过滤器

时间:2014-01-14 11:18:36

标签: regex elasticsearch

我在正确表达ElasticSearch Regexp过滤器的正则表达式时遇到问题。我正在尝试匹配网址字段中“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.*确实会获得包含网址的结果,但不幸的是,网址过于宽泛,例如匹配任何包含“信息”的网址。一旦我在“info-for”中添加连字符,我再次获得0结果。无论我尝试哪种转义字符组合,我要么得到一个解析异常,要么没有匹配。任何人都可以帮忙解释我做错了什么吗?

1 个答案:

答案 0 :(得分:7)

首先,尽可能尝试永远不要使用没有前缀的正则表达式或通配符。搜索.*foo.*的方式是,索引字典中的每个单词都与模式匹配,而模式又构造成匹配项的OR查询。这是 O(n)中语料库中唯一术语的数量,后续搜索也非常昂贵。

本文有更多详细信息:https://www.found.no/foundation/elasticsearch-from-the-bottom-up/

其次,您的网址可能会以某种方式进行标记,使索引中的“信息”和“媒体”分开。因此,字典中没有info-for/media - 术语来匹配正则表达式。

您可能要做的是分别为路径和域编制索引,并使用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的简单术语过滤器。这是一个性能更高的过滤器,也可以缓存。

相关问题