【问题标题】:Best scaleable way to find many keywords in a large amount of text?在大量文本中查找许多关键字的最佳可扩展方式?
【发布时间】:2012-08-18 16:14:26
【问题描述】:

每隔几分钟就会有大约 500 个段落被提交到名为“内容”的表中的数据库中(这个数字在几个月内将超过 2,500 个)。 还有一个名为“Keywords”的表有 4,000 多行(预计将增长到 10,000 多行)。

Keywords
+------------+-------------------+
| Keyword_id | keyword           |
+------------+-------------------+
|          1 | "Venture Capital" |
|          2 | "Financing"       |
+------------+-------------------+

问题是:在传入的文本段落中交叉引用每个关键字以查看是否匹配的解决方案的最佳方法是什么?

因为我不关心段落中哪里有匹配(我唯一关心的是有匹配); if(preg_match()){} 可能有效,但即使在低端,也就是 2,000,000 次,您会在段落中搜索关键字。 另外,如果我错了,请纠正我,preg_match 非常昂贵。

我想到的一个可能是将关键字数组保留在缓存中,而不必为每一行调用数据库。 我认为这肯定有助于加快速度。

我不关心这只存在于 PHP 中。 如果应用程序的这一部分需要使用 Python(如果我错了,请纠正我,但我听说 Python 在解析文本方面要便宜得多),那么我全都听好了。

【问题讨论】:

  • 你为什么不直接使用数据库呢?许多 RDBMS 具有强大的全文功能,并且在这方面做得非常快......
  • 嗯,很有趣。既然我不是数据库专家,那会不会在 mysql 中做诸如“like”语句之类的事情?如果我离得很远,我很抱歉;我总是更多地处理 php 方面的事情,而不是 DB。

标签: php


【解决方案1】:

使用 MySQL:

搜索查询:Vent Capit

使用match against

SELECT * FROM keywords WHERE MATCH (keyword) AGAINST ('+Vent* +Capit*' IN BOOLEAN MODE);

如果您使用_ci 排序规则,(ci 代表不区分大小写),匹配将忽略大小写:)

【讨论】:

  • 这会比使用 preg_match() 从数组中运行脚本要快得多吗?我问的原因是因为(如果我错了,请纠正我)扩展计算(例如使用亚马逊)不是非常容易,但将数据库扩展到 40,000,000 个查询/几分钟却非常困难?基本上:速度是否值得因为无法轻松扩展而付出代价?
  • 几天后进行了一些速度测试,我可以确认,与通过 preg_match() 解析文本相比,这在很大程度上是正确的答案。虽然我不确定这种方式从长远来看是否可扩展,但现在肯定足够了。随着时间的推移,我会更新这个,让你(和其他所有人)知道它是怎么回事。谢谢。
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2016-04-03
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多