Создание инвертированного хеша индекса в Ruby - PullRequest
2 голосов
/ 04 февраля 2012

Я работаю над новым проектом, и мне нужно разработать инвертированный индекс, который можно сохранить в файловой базе данных (например, 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 ТБ или более текста.

Выбранный ответ

Выбранный ответ отлично подходит для этого. Единственное отличие - несколько небольших изменений в синтаксисе, которые работают следующим образом:

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

1 Ответ

3 голосов
/ 04 февраля 2012

CouchDB не будет вашим лучшим инструментом для работы. В частности, он не подходит для быстрых обновлений, которые не увеличивают размер документа (ваши приращения). При каждом обновлении он создает новую версию документа на диске, поэтому ваша база данных будет довольно массивной, а диск будет занят.

Я бы порекомендовал посмотреть MongoDB . Он имеет быстрые обновления на месте, индексы и более богатый язык запросов. Пример:

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

Это найдет документ с идентификатором 'en' и увеличит его поле ['linux']['re']. Если документ не найден, или ['linux'] не существует, или ['linux']['re'] не существует, они будут созданы автоматически. Это одна из моих самых любимых функций в этой БД.

...