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