2009-11-05 48 views
4

我正在构建数据索引,这将需要以(document, term, weight)的形式存储大量三元组。我将存储高达几百万这样的行。目前我正在MySQL中做这个简单的表格。我将文档和术语标识符存储为字符串值,而不是外键到其他表。我正在重新编写软件并寻找更好的数据存储方式。看看HBase的工作方式,这似乎很适合架构。我可以将document映射到{term => weight},而不是存储大量的三元组。HBase是否有意义,如果它没有在分布式环境中运行?

我在单个节点上这样做,所以我不在乎分布式节点等。我应该坚持使用MySQL,因为它的工作原理,还是明智的尝试HBase?我看到Lucene将它用于全文索引(这与我正在做的类似)。我的问题是,单个HBase节点如何与单个MySQL节点进行比较?我来自Scala,所以直接的Java API可以通过JDBC和MySQL解析每个查询的优势吗?

我主要关心的是插入速度,因为这是以前的瓶颈。处理完后,我最终可能会把数据放回到MySQL中进行实时查询,因为我需要做一些在MySQL中更好的计算。

我会尝试两种原型,但我相信社区可以给我一些有价值的见解。

+0

什么是您的插入模式?随机的,批量的,有序的?在批次插入过程中是否应该关闭键?确保使用插入表(...)values(),(),(),(),(),()...(),();所以你不要分析尽可能多的语句,让文本增长到大约mysql服务器通道限制的大小。 – Don 2009-11-07 02:32:29

+0

插入将是随机的:我将扫描数十万个文件,每个文档产生数百个元组。没有排序(但我想通过加权频率从另一端进行排序)。 在我以前的MySQL实现中,是的,我按照您的建议将输入分为多个批次。我不记得尺码,但我尝试了正确的尺码。我也做延期插入,因为在插入时我不关心实时可用的数据。 – Joe 2009-11-07 09:18:21

+0

看过MapReduce之后,这看起来像我可以以不同方式解决的问题(即不是连续写入表中,而是运行单个批处理),但可能更好。 – Joe 2009-11-07 09:19:06

回答

1

使用正确的工具进行工作。

herehere中选择了很多反RDBMS或BASE系统(基本可用,软状态,最终一致),而不是ACID(原子性,一致性,隔离性和耐久性)。

我已经使用传统的RDBMS,尽管您可以存储CLOB/BLOB,但它们并不具有专门用于搜索这些对象的内置索引。

在插入文档时,您希望完成大部分工作(计算找到的每个元组的 的加权频率)。

您可能还想在每次搜索后对每个(documentId,searchWord)对的 对进行评分。

这样你就可以每次都提供更好更好的搜索。

您还希望存储每个搜索的分数或权重,并为其他搜索的相似度加权 分数。

很可能某些搜索比其他搜索更为常见,并且 用户没有正确地搜索他们的搜索查询,尽管他们的意思是 做了一个公共搜索。

插入文档还应该会对搜索权重 索引进行一些更改。

我越想它,解决方案就越复杂。 你必须先从一个好的设计开始。设计预期的因素越多,结果就越好。

1

MapReduce似乎是生成元组的好方法。如果你能把一个scala作业变成一个jar文件(不确定,因为我以前没有用过scala,而且是一个jvm n00b),将它发送并写一些包装器来运行它会很简单在地图上缩小集群。

至于在完成之后存储元组,您还可能想要考虑基于文档的数据库,如mongodb,如果您只是存储元组。

一般来说,这听起来像你正在做更多的统计与文本...你有没有考虑过简单地使用lucene或solr做你在做什么,而不是写你自己的?

+0

谢谢,我会遵循这些建议。仅供参考我不是在处理文本,但是这是一个很好的比喻。 – Joe 2009-11-22 17:09:03

相关问题