在本文中,我们将讨论正则表达式以及如何在 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() 可能是不可或缺的。如果您发现它有用,请告诉我们!