Url 匹配大量模式中的字符串

Url 匹配大量模式中的字符串,url,pattern-matching,Url,Pattern Matching,我想做一个URL匹配系统。它将以这种方式工作: 数据库将包含许多模式。模式的一些元数据如下所示: pattern1, keyword pattern2, keyword ... ... 我有一个输入URL。喜欢htttp://example.com/blabla/111/2222/detail.htm 系统将获取输入,并为输入URL输出最匹配模式的关键字。每秒将有超过20000个请求 我们需要设计的是模式和数据库模型。我已经在这个系统里呆了两个多星期了 我正在考虑在树中匹配URL 树中的所有

我想做一个URL匹配系统。它将以这种方式工作:

数据库将包含许多模式。模式的一些元数据如下所示:

pattern1, keyword 
pattern2, keyword
...
...
我有一个输入URL。喜欢htttp://example.com/blabla/111/2222/detail.htm

系统将获取输入,并为输入URL输出最匹配模式的关键字。每秒将有超过20000个请求

我们需要设计的是模式和数据库模型。我已经在这个系统里呆了两个多星期了

我正在考虑在树中匹配URL

树中的所有节点都可以执行两种输出:哪个节点应该继续匹配URL,或者节点知道哪个关键字应该应用于URL

每个节点将通过回调(存储在db中的脚本)连接。所以不同的节点会有不同的行为

但我们有很多模式。我想我需要一个将模式转换为“节点”的工具。或者至少可以用数据库中的模式构建一个包含现有节点的树

我还在想树的生成。但应该有更好的办法


任何想法都会很有帮助。谢谢你

您需要一种工业强度字符串匹配算法:。我不认为数据库支持的方法能很好地工作,因为听起来您需要模式匹配,而不是精确的前缀匹配


但是如果您使用的是前缀匹配(从一开始最长的匹配),那么您可以使用前缀trie,即。如果我是你,我会将数据库用作持久存储,但将匹配的trie保留在内存中。

你需要一种工业强度字符串匹配算法:。我不认为数据库支持的方法能很好地工作,因为听起来您需要模式匹配,而不是精确的前缀匹配


但是如果您使用的是前缀匹配(从一开始最长的匹配),那么您可以使用前缀trie,即。如果我是你,我会将数据库用作持久存储,但要将匹配的trie保存在内存中。

首先,阅读本文:

在regexp表示法中,您有一个简单的“替换”:

…附加了一个约束,即您想知道哪种模式匹配。我相信增加“汤普森NFA”来提供这一细节是很简单的。(想法:在内部,在每个模式的末尾放置一个唯一的魔法标记,以唯一地标识该模式。魔法标记将匹配空字符串…因此,当匹配引擎点击一个时,它会立即知道匹配的模式。)

这将为您的引擎提供正则表达式的全部功能。即使您不想修改那篇文章中的NFA实现,也有大量关于正则表达式的理论和实践工作。所以我肯定会从大的替换regexp开始,并从那里开始工作

为了获得更好的速度,您可以在将大型替换regexp转换为NFA之前尝试使用正则表达式优化器(类似于Perl)


或者,您可能想从一个通用的regexp引擎(如PCRE)开始,看看它是否足够快。

首先,阅读本文:

在regexp表示法中,您有一个简单的“替换”:

…附加了一个约束,即您想知道哪种模式匹配。我相信增加“汤普森NFA”来提供这一细节是很简单的。(想法:在内部,在每个模式的末尾放置一个唯一的魔法标记,以唯一地标识该模式。魔法标记将匹配空字符串…因此,当匹配引擎点击一个时,它会立即知道匹配的模式。)

这将为您的引擎提供正则表达式的全部功能。即使您不想修改那篇文章中的NFA实现,也有大量关于正则表达式的理论和实践工作。所以我肯定会从大的替换regexp开始,并从那里开始工作

为了获得更好的速度,您可以在将大型替换regexp转换为NFA之前尝试使用正则表达式优化器(类似于Perl)


或者,您可能想从一个通用的regexp引擎(如PCRE)开始,看看它是否足够快。

两周后,您是否没有任何工作要显示?Tsk。@mike caron抱歉,但现在我已经更新了帖子。两周了,你没有任何工作要展示?Tsk。@mike caron对不起,但现在我已经更新了帖子。
pattern1|pattern2|pattern3|...