我正在开发一个新项目,我必须开发一个可以存储在文件数据库(例如 CouchDB)中的倒排索引。我正在使用 Ruby 1.8.7 进行编码。
这是倒排索引的格式:
{
"en": {
"#linux": {
"re": 144,
"patch": 142,
"1": 55,
"to": 53
},
"#something": {
"word": 20
}
},
"fr": {},
"es": {}
}
我想要一种使用 CouchDB 之类的方法,我可以通过一系列检查来创建条目,如下所示:
- 如果第二个哈希键(即
#linux
)尚未创建,则创建它 - 如果尚未创建第三个哈希键(即
patch
),则创建它并将其值设置为1
- 每次相同的单词再次出现时,重复并增加计数(最右边的值)
['en']['#linux']
或任何变量。<
我仅使用基本哈希值就很好地解决了这个问题,但是当我将脚本设置为处理大约 1TB 或更多的文本时,将这些哈希值存储在内存中并不是很好。
所选答案
所选答案非常适合此目的。唯一的区别是语法上有一些细微的变化,其工作原理如下:
@db.collection.update({"_id" => lang}, {"$inc" => {"#{tag}.#{word}" => 1}}, { :upsert => true })
最佳答案
CouchDB 不会是完成这项工作的最佳工具。特别是它不适合不增加文档(您的增量)的快速更新。每次更新时,它都会在磁盘上创建一个新版本的文档,因此您的数据库将非常庞大,并且磁盘将很繁忙。
我建议查看MongoDB 。它具有快速的就地更新、索引和更丰富的查询语言。示例:
db.collection.update({_id: 'en'},
{$inc: {'linux.re': 1}},
true);
这将找到 id 为“en”的文档并递增其 ['linux']['re']
字段。如果未找到文档,或 ['linux']
不存在,或 ['linux']['re']
不存在,则它们将自动创建。这是我最喜欢的数据库功能之一。
关于ruby - 在 Ruby 中创建倒排索引哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9143864/