2

问题来了,

我有一个与您的常规客户、产品、订单模式相关的 SQL 数据库,但非常庞大。[每张表有 10 万行]。还有一个带有 order_email [大约 1 亿行] 的大表。此表包含与订单关联的所有电子邮件通信。我已经在 order_email 之上实现了全文搜索,效果很好。

现在我想扩展电子邮件搜索功能以根据其他域对象进行过滤。即回答诸如

  • 向发送电子邮件的客户显示“永不放弃”
  • 显示带有短语“更多小马”的关联电子邮件的订单。

实现是对 lucene 结果和 sql 结果进行交集/连接,但由于涉及的表和索引的大小,我想不出一种方法来不遇到问题

我失败的方法

  • 蛮力。将我的大部分数据库列添加为 lucene 字段。这相当于非规范化我的整个数据库并创建一个包含所有列作为字段的 Lucene 索引(以 Terrabytes 为单位的大小)。性能糟透了,成本高得令人望而却步。

  • 获取 Lucene 结果集,从中获取 OrderID 并查询数据库,例如 SELECT * from Order where OrderID IN( ORDERIDs from Lucene )。这不起作用,因为电子邮件搜索可能会产生一百万个 orderID,这会使 SQL 查询的性能很差。

  • 在应用程序代码中进行连接,但迭代 sql 结果和 lucene 结果。这意味着根据结果的大小,单个查询可以加载 2 百万行数据集并对其进行迭代,从而浪费 CPU 和内存。

关于如何构建 2 个大型数据集的连接/交集的想法?

ps:第一个建议hadoop是一个臭鸡蛋。希望我能,但我们没有更多硬件的预算。

4

1 回答 1

0

就像 OzrenTkalcecKrznaric 在对问题的评论中所说的那样,分页是你的朋友。(请记住,曾经开发过的最强大的算法是“分而治之”。)

于 2013-08-16T19:32:51.233 回答