我有 1 个名为“关键字”的表,其中包含关键字列表(可以是短语或单个单词),其列为:ID、关键字。
还有另一个名为“已阻止”的表,其中包含单词列表(单个单词,而不是短语),应使用该列表来过滤“关键字”表。它的列是:ID、Word。
我想知道一种快速方法或优化方法来从“关键字”表中过滤关键字以及“已阻止”表中列出的所有单词。
例如,在“关键字”表中,我有以下列表:
1 - Friends in Facebook
2 - Blogging with Facebook
3 - Finding Friends
4 - Doing something to Friends in Facebook
5 - Programming is Fun
这也是我在“已阻止”表中的列表:
1 - play
2 - friend
3 - find
每当我从“关键字”表中获取关键字时,都应该使用“已阻止”表中列出的单词对其进行过滤。因此,在这些列表中,如果我从“关键字”表中获取数据,我应该得到以下结果:
2 - Blogging with Facebook
5 - Programming is Fun
请注意,#1 未包含在内,因为它包含单词“friend”(列在“Blocked”表中)。 #3 也不包含在内,因为它包含“find”。最后,#4 不包括在内,因为它也包含“friend”。
我最大的问题是用什么样的方法才能达到这个目的。请注意,我有大量的关键字(大约 1000 万条记录)和至少 100 个屏蔽词。我为此开发了一个 PHP+MySQL 解决方案,但它真的很慢。
希望您能给我您的解决方案或建议。
最佳答案
如果您想要性能,您应该忘记尝试过滤这样的大表。
您应该创建另一个包含白名单单词的表,该表是在添加/删除/编辑黑名单单词时生成的,并在需要此过滤器的查询上使用该表。当您根据可能添加/删除已列入名单的关键字的事件更新此表时,就会存在开销。
这样你就可以避免:
- 带有 NOT IN 的子查询
- 大循环或 array_map/filter 函数
请记住,今天您有 100 个关键字,但明天您可能有 1000 个关键字,并且使用除在新表格上预过滤结果之外的任何其他方法都会带来性能损失,并且始终会扩大您要查找的内容之间的差距.
关于php - 如何从 MySQL 查询中过滤被阻止的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9095230/