【问题标题】:Creating an inverted index hash in Ruby在 Ruby 中创建倒排索引哈希
【发布时间】:2012-02-04 19:35:36
【问题描述】:

我正在做一个新项目,我必须开发一个可以存储在文件数据库(例如 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 })

【问题讨论】:

    标签: ruby hash couchdb inverted-index


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2012-11-23
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2010-09-07
      相关资源
      最近更新 更多