天天看点

Elasticsearch【正则搜索】分析&实践

regexp允许使用正则表达式进行term查询.注意regexp如果使用不正确,会给服务器带来很严重的性能压力。比如.*开头的查询,将会匹配所有的倒排索引中的关键字,这几乎相当于全表扫描,会很慢。因此如果可以的话,最好在使用正则前,加上匹配的前缀。在正则中如果使用<code>.*?</code>或者<code>+</code>都会降低查询的性能。

举个简单的例子:

正则支持的一些标准的用法:

如果给定的term是<code>abcde</code>

也支持使用<code>^</code>或者<code>$</code>来指定开头或者结尾。

一些特殊字符是需要转义的,比如:

如果想要搜索某个固定的词,也可以加上双引号。

<code>.</code>可以匹配任意字符,比如

这几个都可以匹配abcde

使用<code>+</code>表示匹配一个或者多个字符

上面这些都可以匹配<code>aaabbb</code>

使用<code>{}</code>支持匹配指定的最小值和最大值区间

比如对于字符串:

对于字符串<code>ababab</code>

支持或操作的匹配,注意这里默认都是最长匹配的。

支持在<code>[]</code>中进行字符匹配,<code>^</code>代表非的意思

其中<code>-</code>代表的范围匹配。

在正则表达式中也支持一些特殊的操作符,可以使用flags字段控制是否开启。

这个表示正则表示匹配一段字符串,比如<code>ab~cd</code>意思是:a开头,后面是b,然后是一堆非c的字符串,最后以d结尾。比如字符串<code>abcdef</code>

interval选项支持数值的范围,比如字符串<code>foo80</code>:

使用<code>&amp;</code>可以实现多个匹配的连接,比如字符串<code>aaabbb</code>:

使用<code>@</code>,可以匹配任意的字符串

先来分析一下,<code>a,b,c</code>被默认分析成了什么?

然后查询一下:

再换成b字段试试:

这是为什么呢?

因为整个regexp查询是应用到一个词上的,针对某个词,搜索<code>a.*b.*</code>,a字段由于不分词,它的词是整个的<code>a.b.c</code>;b字段经过分词,他的词是<code>a</code>和<code>b</code>和<code>c</code>三个独立的词,因此针对a字段的正则搜索可以查询到结果;但是针对b字段却搜索不到。

归纳起来,还是需要好好理解分词在搜索引擎中的作用才行。

继续阅读