在本文中,我们将讨论正则表达式以及如何在Manticore搜索中使用它们
如果我们谈论文本匹配,最简单的方法就是字符串比较。搜索字符串和文档或字段必须完全相同。下一个文本搜索方法是执行简单的模式匹配,可以允许将搜索字符串作为字段的子部分匹配。这种简单的模式匹配可以使用基本运算符(如通配符),其中元字符如*
或%
表示"匹配任何字符"。在数据库中,这通常通过LIKE运算符实现,例如:
SELECT * FROM mytable WHERE title LIKE '%and%'
将匹配标题中包含文字’and’子串的行。
正则表达式与普通文本一样工作,与LIKE相同,但它们提供了一组强大的元字符-运算符,可以构建复杂的匹配模式。正则表达式模式在字符级别工作,可以匹配字母、数字数字和其他字符,可以是按字面值(如/abc/
将匹配abc
)或按字符类型,例如\w
将匹配[A-Aa-z0-9_]
。该模式还可以包括布尔或
,如abc|xyz
,数量限定符 - ?
标记前面字符或通配符(元字符.
)的零或一个出现。
与正则表达式不同,全文搜索不是在纯文本上操作,而是解析文本并将其分割成单词。全文搜索不尝试在字符串上查找模式,而是在单词集合中查找。虽然正则表达式可以查找和隔离单词,但它们确实有自然限制,无法轻松执行二进制搜索(如abc -xyz
)或处理形态学功能。正则表达式中的一些功能也可以在全文搜索中找到,如开始/结束运算符。有些工作方式不同。例如,正则表达式中的通配符可以代替任意数量的字符,但在全文搜索中,通配符只能在单词范围内扩展,或者它们可以完全替代一个单词。
如何在Manticore搜索中使用正则表达式?
到目前为止,正则表达式作为索引时的可选功能通过
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()可能是不可或缺的。如果您发现它很有用,请告诉我们!