基本上,对于这项任务,您可以有效地使用任何支持基于 B+树的索引的 SQL 数据库(MySQL 将满足您的完美需求)。
创建 3 个表:
- 文档表,列:id/document
- N-gram 表:n_gram_id/n_gram
- n-gram 和文档之间的映射:document_id/n_gram_id
在 N-gram table/n_gram string 和 Mapping table/n_gram_id 上创建索引,默认情况下主键也会被索引。
您的操作将是高效的:
- 插入文档:只需提取所有 n-gram 并插入到文档表和 N-gram 表中
- 在索引的支持下查找 in_gram 将很快
- 查询包含子 n-gram 的所有 n-gram:分 2 步 - 只需根据索引查询所有包含来自第二个表的子 n-gram 的 n-gram。然后 - 检索每个 n-gram 的所有相应文档。
您甚至不需要使用连接来实现所有这些操作,因此索引会有很大帮助。此外,如果数据不适合在一台机器上 - 您可以实施分片方案,例如将 n_grams 存储在一台服务器上,然后将 oz 存储在另一台或其他合适的方案上。
您也可以使用 MongoDB,但我不确定您需要如何实现索引方案。对于 MongoDB,您将免费获得分片方案,因为它已经内置。