Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex ElasticSearch正则表达式过滤器_Regex_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Regex,elasticsearch" /> elasticsearch,Regex,elasticsearch" />

Regex ElasticSearch正则表达式过滤器

Regex ElasticSearch正则表达式过滤器,regex,elasticsearch,Regex,elasticsearch,我在为ElasticSearch regexp筛选器正确表达regexp时遇到问题。我正在尝试匹配url字段中“info for/media”中的任何内容,例如。为了尝试正确使用正则表达式,我现在正在使用match_all,但最终将match_phrase与用户的查询字符串匹配 发布到本地主机:9200/\u搜索 { "query" : { "match_all" : { }, "filtered" : {

我在为ElasticSearch regexp筛选器正确表达regexp时遇到问题。我正在尝试匹配url字段中“info for/media”中的任何内容,例如。为了尝试正确使用正则表达式,我现在正在使用
match_all
,但最终将
match_phrase
与用户的查询字符串匹配

发布到本地主机:9200/\u搜索

{
"query" : {
               "match_all" : { },
               "filtered" : {
                           "filter" : {
                                   "regexp": {
                                        "url":".*info-for/media.*" 
                                    }
                          }
                }
         },
}

这将返回0个点击次数,但解析正确
*info.*
确实会得到包含url的结果,但遗憾的是,结果太宽,例如匹配任何包含“信息”的url。在“info for”中添加连字符后,我再次得到0个结果。无论我尝试什么转义字符组合,我要么得到一个解析异常,要么没有匹配项。谁能解释一下我做错了什么

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

本文提供了有关这方面的更多详细信息:

第二,您的url可能以某种方式标记,使“info for”和“media”在索引中分开。因此,字典中没有与regexp匹配的/media-术语的
信息

您可能想做的是分别为路径和域编制索引,并使用-tokenizer生成术语

下面是一个示例,演示如何生成令牌:

即,
/foo/bar/baz
生成标记
/foo/bar/baz、/foo/bar、/foo
,域
foo.example.com
被标记为
foo.example.com、example.com、com


然后,在
/foo/bar
中搜索任何内容都可以是匹配
路径:/foo/bar
的简单术语过滤器。这是一个性能更高的过滤器,也可以缓存。

一个更简单的选项是将此字段映射为具有未分析版本的多字段,并在未分析字段上运行regexp过滤器。一般来说,regexp过滤器在未分析的字段上更有意义。这仍然是一个非常昂贵的查询。感谢@AlexBrasetvik,我在将映射/分析器配置的JSON版本发布到我的索引设置端点时遇到了一些困难。它找不到我声明的分析器。如果您有示例JSON,它将非常有用,谢谢。@AlexBrasetvik为什么在未分析的字段上执行正则表达式仍然很昂贵?