在Ruby中创建反向索引哈希



我正在处理一个新项目,我必须开发一个可以存储在文件数据库(如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']不存在,则会自动创建这些文档。这是我最喜欢的DB功能之一。

最新更新