Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何针对大型规则集(5000+和不断增长)构建高效的电子邮件过滤器_Python_Regex_Email_Postgresql - Fatal编程技术网

Python 我如何针对大型规则集(5000+和不断增长)构建高效的电子邮件过滤器

Python 我如何针对大型规则集(5000+和不断增长)构建高效的电子邮件过滤器,python,regex,email,postgresql,Python,Regex,Email,Postgresql,我正在构建一个电子邮件过滤器,我需要一种方法来有效地将一封电子邮件与大量过滤器/规则进行匹配。可以在以下任何字段上匹配电子邮件: 从名字 发件人地址 汇款人姓名 送地址 主题 消息体 目前,在我们的PostgreSQL 9.1数据库中,在一个表中定义了5000多个过滤器,并在不断增长。每个过滤器可能有一个或多个以上的字段,其中填充了Python正则表达式 当前执行筛选的方式是选择所有筛选器并将其加载到内存中。然后,我们对每封电子邮件进行迭代,直到在所有非空白字段上找到正匹配。不幸的是,这意味着对

我正在构建一个电子邮件过滤器,我需要一种方法来有效地将一封电子邮件与大量过滤器/规则进行匹配。可以在以下任何字段上匹配电子邮件:

从名字 发件人地址 汇款人姓名 送地址 主题 消息体 目前,在我们的PostgreSQL 9.1数据库中,在一个表中定义了5000多个过滤器,并在不断增长。每个过滤器可能有一个或多个以上的字段,其中填充了Python正则表达式

当前执行筛选的方式是选择所有筛选器并将其加载到内存中。然后,我们对每封电子邮件进行迭代,直到在所有非空白字段上找到正匹配。不幸的是,这意味着对于任何一封电子邮件,可能会有多达30000 5000 x 6的重新匹配操作。很明显,随着越来越多的过滤器被添加,这将无法扩展,实际上它已经没有了

有更好的方法吗

到目前为止,我已经考虑了以下选项:

将保存的python正则表达式转换为POSIX样式的正则表达式,以利用PostgreSQL的类似于表达式。这真的会更快吗?在我看来,这只是将负载转移到其他地方

基于每个用户定义过滤器。虽然这并不实际,因为在我们的系统中,用户实际上受益于大量预定义的过滤器

切换到基于文档的搜索引擎,如elastic search,其中要过滤的第一封电子邮件保存为规范表示。通过查找类似的电子邮件,我们可以缩小到一个特定的功能集进行测试,并得到一个积极的匹配

切换到bayes过滤器,这也将给我们一些机器学习能力,以检测类似的电子邮件或对现有电子邮件的更改,这些更改仍将以足够高的概率匹配,以猜测它们是相同的东西。这听起来很酷,但我也不确定它是否能很好地扩展


有其他的选择或方法要考虑吗?

< P> PostgreSQL第9.1版中的TrangRAM支持可以给你想要的。 在定于2012年夏天发布的9.2版本中,它几乎肯定是一个可行的解决方案,因为新版本知道如何使用三元索引快速匹配正则表达式。在我们的商店,我们发现三元索引的速度非常好


此外,如果您想进行最近邻搜索,即根据与搜索参数的相似性找到K个最佳匹配项,则三角图索引非常棒—它实际上会按距离的顺序返回索引扫描中的行。请搜索KNN要点以获取评论。

这些正则表达式有多复杂?如果它们真的是正则表达式,没有所有疯狂的python扩展,那么您可以将它们组合成一个单独的regexp作为替代,然后使用一个简单的ie内存regexp匹配器

我不确定这是否有效,但我怀疑您会惊喜地发现regexp编译成了一个更小的状态机,因为它将合并公共状态


此外,对于快速正则表达式引擎,考虑使用哪一个将快速扫描。当你从一个标题跳到下一个标题时,这应该会给你一个加速。我自己没有用过,但他们是朋友的朋友,当我读到这篇文章时,这篇文章看起来很整洁。

@agf谢谢你的反馈,那么我应该在哪里发布这个问题呢?我以为这些标签是为了标记这篇文章所涉及的技术。对不起,这是一个打字错误。我的意思是说堆栈溢出是针对范围合理的特定问题。这太开放了——你在征求意见和建议。如果您提出具体的技术问题,我们可以提供帮助。你需要在一个鼓励开放式讨论的网站上发布这样一个问题。太棒了,谢谢@kgrittn听起来像是我想要的那种东西。我会检查一下,然后再给你回复。