2012-04-26 6 views
1

У меня есть существующее приложение Rails, которое использует шину (0.4.0) для взаимодействия с двигателем Elasticsearch (0.17.4). В нем уже есть несколько моделей, использующих Tire :: Persistence. Я хочу добавить новую модель, которая использует преимущество версий Elasticsearch, отслеживать все изменения и иметь возможность вернуться к предыдущим версиям.Обновление версий Elasticsearch с помощью Tire gem

Прямо сейчас, когда я извлекаю экземпляр модели 'persisted', я проверяю _version, и он всегда nil. Я не нашел никакой документации по шинам, относящейся к управлению версиями. Должен ли я активировать его каким-либо образом или вручную сохранять записи с значениями версии? Я даже на правильном пути здесь?

Я вижу, что некоторые методы возвращают _version значения для элементов, но другие этого не делают ...

Article.first._version       # => nil 
Article.search("sample query").first._version # => nil 
Article.find("id_123")._version     # => 8 

Кроме того, управление версиями, кажется, увеличивается на 2. Возможно, шина не полностью оборудована, чтобы иметь дело с версиями , Сохраняется ли предыдущая версия? Как получить предыдущую версию записи?

[EDIT] Возможно, я неправильно понял, что такое «версия» на самом деле в Elasticsearch. Похоже, что это в основном для контроля параллелизма. О, ну. (Я хотел бы услышать, в противном случае, хотя)

ответ

2

Прежде всего, да, как вы пишете в Edit версии в ElasticSearch не предназначены для хранения пересмотров документа, но и для управления параллелизмом (например, не перезапись документа с устаревшей версией).

Во-вторых, вы должны заявить, что хотите, чтобы версии вернулись из поиска; http://www.elasticsearch.org/guide/reference/api/search/version.html

Этот код покажет вам, как это сделать в Шины.

require 'tire' 

Tire.index('articles') do 
    delete 
    create 
    store id: 1, title: 'One' 
    store id: 2, title: 'Two' 
    store id: 2, title: 'Two again' 

    refresh 
end 

articles = Tire.search('articles') do 
      query { all } 

      version true 
      end.results 

articles.each do |article| 
    puts "Article '#{article.title}' has version #{article._version}" 
end 

На данный момент, это лучше читать Tire интеграции тестов для документации. Документация - это, конечно, то, что должно и должно улучшиться.

Что касается вашего первоначального требования, подобные вопросы регулярно появлялись для CouchDB в прошлом. В блоге Simple Document Versioning with CouchDB описывается одна хорошая стратегия. Было бы полезно исследовать решения CouchDB, так как модель документа аналогична. (Конечно, CouchDB, вопреки ElasticSearch ли физически хранить ревизии документов, таким образом, он открывает различный диапазон стратегий.)

В ElasticSearch, ваше принципиальное решение о работе с версиями будет:

Do I хотите хранить полные ревизии непосредственно в самом JSON?

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

Nested Type в ElasticSearch сделает работу с этими «ревизиями как вложенными документами» удобной и простой.

(Вы также можете хранить только «diffs» документов в самом JSON, но я бы поставил пари.)

Я хочу хранить ревизии в виде отдельных документов?

Возможно, вы захотите сохранить ревизии отдельно и «соединить» их с базовым документом. parent/child support в ElasticSearch позволил бы работать с этими отношениями и запросами.

Смежные вопросы