小编典典

ElasticSearch正则表达式过滤器

elasticsearch

我在为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结果。无论我尝试使用哪种转义字符组合,我都会遇到解析异常或没有匹配项。有人可以帮我解释我做错了吗?


阅读 805

收藏
2020-06-22

共1个答案

小编典典

首先,尽可能尝试不要使用没有前缀的正则表达式或通配符。搜索的方式.*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。那是性能更高的筛选器,也可以缓存。

2020-06-22