1

我正在编写将处理超过100Gb文本文档的应用程序。每个文档的大小为 2Kb-100Kb。

起初我应该使用 MySQL 或 Firebird 等 DBMS来存储原始文档,并将索引存储在 lucene 的索引中。这种方法有一些缺点。例如,数据库事务对 lucene 索引一无所知,反之亦然。所以我需要同步它们。

然后我假设 Lucene 可以将整个文档存储在 index 中。所以我需要定期创建索引的备份。但这很容易:我可以使用索引复制整个目录。我使用某种无 SQL 存储(即 Lucene)。而且我可能不会使用 DBMS。

最佳实践是什么:是否将原始文档存储在索引中?我真的不想将 DBMS 用于此目的。可能吗?

4

1 回答 1

3

您不希望将原始文档存储在 Lucene 索引中,尤其是您正在谈论的大小。我已经通过几种方式做到了这一点,但两者都只将索引字段存储在 Lucene 索引中,并且您有一个指向原始文档的 ID/指针。我已经处理了超过 1 亿条记录的索引,它们在单个服务器上运行良好。

这很重要的原因是,如果您不需要存储额外的 100 gig 数据,则索引的构建时间和索引的可管理性会显着下降。

基本上,您需要为搜索/满足搜索查询所需的所有字段编制索引。如果用户单击网格中的项目,我假设您想要显示原始文本(UI 模式是大多数时候您将访问很多 Lucene 字段,但很少需要下拉完整的二进制文本文件)。

我与 Lucene 一起使用的原始访问权限是:

  • SQL Server FILESTREAM,针对大型二进制文件存储进行了优化。它也非常快。不确定MySQL是否有这个(从未使用过)
  • Azure 表存储,这是一个键值对 NoSQL 云数据库。那是用来存储二进制 blob 的。

持久存储是什么实际上并不重要,只要它针对可以基于密钥快速访问/流式传输的较大二进制文件进行了优化。你也可以使用像 Redis 这样的内存缓存,只要 Lucene 有 ID 指针来访问二进制文本文件。

于 2013-11-09T22:35:30.917 回答