在Ruby中创建倒排索引哈希

时间:2012-02-04 19:35:36

标签: ruby hash couchdb inverted-index

我正在开发一个新项目,我必须开发一个可以存储在文件数据库(例如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']或任何变量时,重复并将计数(最右边的值)加1。

我使用基本哈希完成了问题,但是当我将脚本设置为大约1TB或更多文本时,将这些内容放在内存中并不会很好。

选择答案

所选答案适用于此。唯一的区别是对语法稍作修改,其工作原理如下:

@db.collection.update({"_id" => lang}, {"$inc" => {"#{tag}.#{word}" => 1}}, { :upsert => true })

1 个答案:

答案 0 :(得分:3)

CouchDB不会成为您工作的最佳工具。特别是它不适合不增长文档的快速更新(您的增量)。在每次更新时,它会在磁盘上创建一个新版本的文档,因此您的数据库将非常庞大,磁盘将会很忙。

我建议查看MongoDB。它具有快速的就地更新,索引和更丰富的查询语言。例如:

db.collection.update({_id: 'en'},
                     {$inc: {'linux.re': 1}},
                     true);

这将找到ID为“en”的文档,并递增其['linux']['re']字段。如果找不到文档,或者['linux']不存在,或者['linux']['re']不存在,则会自动创建它们。这是我最喜欢的数据库之一。