# Regular expressions in Manticore Search

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


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

```
将匹配标题中包含字面字符串 'and' 的行。

正则表达式与 LIKE 一样作用于纯文本，但它们提供了一组强大的元字符-操作符，允许构建复杂的匹配模式。正则表达式模式在字符级别工作，可以匹配字母、数字和其他字符，无论是通过字面值（如 `/abc/` 将匹配 `abc`）还是通过类别类型，例如 `\w` 将匹配 `[A-Aa-z0-9_]`。模式还可以包含布尔 `或`，如 `abc|xyz`，量化 - `?` 表示前面字符或通配符（元字符 `.`）的零次或一次出现。

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

直到现在，正则表达式作为索引时的可选功能，通过 [regexp_filter](https://docs.manticoresearch.com/latest/html/conf_options_reference/index_configuration_options.html#regexp-filter) 提供。正则表达式可用于执行字符串转换，这些转换否则难以通过常规的分词选项实现。例如，可以将连字符 'ae' 替换为 'a'，或者可以将模式 `XX"` 替换为 `XX inch`。

自 [2.7.5](https://github.com/manticoresoftware/manticoresearch/releases/tag/2.7.5) 版本起，正则表达式可以在 SELECT 查询中使用 [REGEX()](https://docs.manticoresearch.com/latest/html/searching/expressions,_functions,_and_operators.html#expr-func-regex) 函数。REGEX() 接受一个输入字符串，该字符串可以来自字符串属性或 JSON 字符串属性，以及一个将针对输入进行测试的正则表达式。REGEX 仅适用于属性值，不能用于全文字段。

当我们可以已经在全文字段中索引文本时，为什么还需要 REGEX 函数？
首先，我们可能有字符串（无论是作为属性还是 JSON 数据），需要应用与全文匹配无关的搜索模式。例如，元数据可能包含一些代码，我们希望缩小搜索范围，仅提供这些代码以数字开头的记录：

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

```
另一个原因是目前 JSON 属性中的文本数据未作为全文进行索引。如果我们需要在某些字符串属性上执行比比较匹配更多的操作，就需要将它们放入全文字段（并使用 [ZONEs](https://docs.manticoresearch.com/latest/html/conf_options_reference/index_configuration_options.html#index-zones) 来允许将匹配限制到特定标签）或多个全文字段（如果这些属性的数量可能变化，这可能是个问题）。

例如，封装在 JSON 对象中的产品元数据可以包含一个属性，该属性包含该产品的兼容设备列表。使用 REGEX，我们可以创建一个模式来匹配我们想要的产品，甚至该产品的一系列型号：

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

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