Manticore Search中的正则表达式

在这篇文章中,我们讨论正则表达式以及如何在Manticore Search中使用它
如果我们谈论文本匹配,最简单的就是字符串比较。搜索字符串和文档或字段必须完全相同。下一个文本搜索方法是通过执行简单的模式匹配,这可以允许将搜索字符串作为字段的子部分进行匹配。这种简单的模式匹配可以使用基本运算符,如通配符,其中像*%这样的元字符表示“匹配任何字符”。在数据库中,这通常通过LIKE运算符来实现,例如:

SELECT * FROM mytable WHERE title LIKE '%and%'

将匹配标题中包含字面“and”子字符串的行。

正则表达式在纯文本上操作,与LIKE相同,但它们带有一组强大的元字符-运算符,允许构建复杂的匹配模式。正则表达式模式在字符级别工作,可以匹配字母、数字和其他字符,既可以通过字面值(如/abc/将匹配abc)也可以通过类别类型,例如\w将匹配[A-Aa-z0-9_]。该模式还可以包括布尔“或”,如abc|xyz,量化 - ?标记前面字符的零次或一次出现或通配符(元字符.)。

与正则表达式不同,全文搜索不在纯文本上操作,而是解析文本并将其分割成单词。全文搜索并不试图在字符串中找到模式,而是在单词集合中查找。虽然正则表达式可以找到并隔离单词,但它们确实有自然的局限性,因为它们无法执行简单的二进制搜索,如abc -xyz或处理形态功能。在正则表达式中找到的一些特性也可以在全文搜索中找到,如开始/结束运算符。有些工作方式不同。例如,正则表达式中的通配符可以占据任意数量的字符,但在全文搜索的情况下,通配符只能在单词的范围内扩展,或者可以完全替代一个单词。

正则表达式如何在Manticore Search中使用?

正则表达式直到现在作为索引时的可选功能通过 regexp_filter 可用。正则表达式可以用于执行字符串的转换,否则通过常规的标记化选项更难实现。例如,'ae'连字可以替换为'a',或者您可以将模式XX"替换为XX inch

2.7.5 以来,正则表达式可以在SELECT查询中使用 REGEX() 函数。REGEX()接受一个输入字符串,可以来自字符串属性或JSON字符串属性,以及将针对输入进行测试的正则表达式。REGEX仅适用于属性值,不能用于全文字段。

为什么需要REGEX函数,而我们已经可以在全文字段中索引文本?
首先,我们可能有字符串(作为属性或在JSON数据中),我们需要应用一个与全文匹配不一定相关的搜索模式。例如,元数据可以包含一些代码,我们希望缩小搜索范围,仅提供这些代码以数字开头的记录,如

SELECT * FROM myindex WHERE MATCH('something') AND REGEX(json_attr.code, "^\d\w+")

另一个原因是,目前来自JSON属性的文本数据未作为全文索引。如果我们需要对某些字符串属性执行比比较匹配更多的操作,我们需要将它们放入全文字段中(并利用 ZONEs 来限制匹配特定标签)或在多个全文字段中(如果这些属性的数量可能变化,这可能会成为一个问题)。

例如,封装在JSON对象中的产品元数据可以包含一个与该产品兼容设备列表的属性。通过REGEX,我们可以创建一个可以匹配我们想要的产品或甚至该产品系列的模式:

SELECT * FROM myindex WHERE MATCH('red case') AND REGEX(json_attr.compatible_devices, "Galaxy S[7|8|9]")

在某些情况下,REGEX()可能是不可或缺的。如果您发现它有用,请告诉我们!

安装Manticore Search

安装Manticore Search