ruby - 在 Ruby 中创建倒排索引哈希

标签 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']或任何变量。<

我仅使用基本哈希值就很好地解决了这个问题,但是当我将脚本设置为处理大约 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/

相关文章:

Ruby 在扩展时调用模块方法

ruby - 简单的 Jekyll 转换器插件不起作用

ruby-on-rails - gmail 阻止 Rails 应用程序发送电子邮件

java - 清除期间 couchdb gen_server 调用超时

ruby - 更新 gem ?

hash - SHA 的 SHA 作为复合对象的签名

不同键但相同哈希码的java HashMap 行为

C# MD5 哈希与 Java/PHP MD5 哈希不匹配

CouchDB:是否可以访问过滤器功能内的链接文档?

couchdb - 如何对文档进行部分更新