如果您想利用搜索索引功能在次线性时间内搜索多个文档,那么根据您提供的信息,
没有方法。您必须检查索引中的每个文档并对每个文档的存储表达式进行操作。
正则表达式本质上是一种类型的程序。
通常情况下,为了评估它而不需要理解表达式中编码的特定概念,需要知道完整的表达式,并且引擎必须实际运行它。这意味着没有办法
通常地将该领域总结或分类为搜索索引以加速查找。如果您希望检查字符串与N个正则表达式匹配,则必须逐个检查这些N个正则表达式并检查它们。此时,搜索索引不提供存储、获取或管理它们的任何好处。
如果您完全满意“缓慢”的搜索,并且坚决要以这种方式存储任意表达式,则从技术上讲,
是的,您可以实现一种将字段视为正则表达式并针对输入运行的新类型查询。我不认为这是搜索索引的正常使用方式,但逻辑在技术上与任何其他类型的评估一样可能。
然而,也许您正在尝试解决错误的问题。可能有更好的方法来表示您当前尝试存储为正则表达式的概念。如果您可以设计一个更具体的“语言”或结构来匹配,那么理论上,您可以创建一个分析器,将
该数据转换为可索引和可优化的字段。
例如:也许您只想使用正则表达式根据前缀中数字的数量和字母的数量来匹配某个ID代码(如
1200ABC00012
或
1G021
)。在这种情况下,与其索引正则表达式,不如索引这两个数字:前缀中数字计数和字母计数。因此,如果搜索字符串是
DG56
,我可以搜索匹配查询的文档,例如
numberPrefixWidth:0 letterPrefixWidth:2
。或对于搜索字符串
789FGH4
,我的查询将是
numberPrefixWidth:3 letterPrefixWidth:3
。
因为我们已经简化了实际表示在文档中的概念,所以没有必要查看每个文档(并基本上运行存储的程序)以找到匹配的文档。我们可以使用Lucene进行它擅长的类型的搜索。
注意:此答案也适用于您的RDBMS示例。如果您想在MariaDB中执行像
WHERE someSearch REGEXP theRegexpColumn
这样的操作,则引擎必须遍历每一行并对其进行评估。在这种设计中,没有可能进行基于索引的优化。不同之处在于Lucene更具特殊用途,并且没有像SQL那样广泛的语言,可以轻松运行此类查询而不需要自己进行一些工作。
"^(?!\d{3}[A-G]\d{2}[A-G]\d{2}$).*"
? - Wiktor Stribiżew123D56G89
,将其与所有保存的正则表达式匹配的文档进行评估,并返回这些文档(如果有)。 - theo@&~([0-9]{3}[A-G][0-9]{2}[A-G][0-9]{2})
。 - Wiktor Stribiżew