Но это решается с помощью внешнего поискового движка lucene
под убунтой ставится примено так:
- ставим git и Maven2, для компиляции couchdb-lucene
# sudo apt-get install git-core maven2
- стягиваем репозиторий couchdb-lucene
# git clone git://github.com/rnewson/couchdb-lucene.git
# cd couchdb-lucene
# mvn
в итоге должен получиться jar-файл "couchdb-lucene*-jar-with-dependencies.jar" (вместо * ваша версия)
потом редактируем настройки couchdb (обычно это файл /usr/local/etc/couchdb/default.ini)
некоторые разделы уже созданы, а некоторые нужно добавить. проверяйте.
[couchdb]
os_process_timeout=60000 ; increase the timeout from 5 seconds.
[external]
fti=/usr/bin/java -server -jar /ПУТЬ_К_JAR_ФАЙЛУ/couchdb-lucene*-jar-with-dependencies.jar -search
[update_notification]
indexer=/usr/bin/java -server -jar /ПУТЬ_К_JAR_ФАЙЛУ/couchdb-lucene*-jar-with-dependencies.jar -index
[httpd_db_handlers]
_fti = {couch_httpd_external, handle_external_req, <<"fti">>}
А вот дальше идет западло, которое нигде не было описано.
- нужно открыть ваш CouchDB по адресу http://localhost:5984/_utils/
- войти в базу данных где хотите добавить поиск
- выбрать "Design documents"
- нажать "Create document ..."
- и назвать его "_design/lucene"
- добавить поле "fulltext"
- в котором писать условия поиска (какие параметры писать можно посмотреть тут), для примера сделаем поиск по полю subject и отдельно по полю body
{
"by_subject": {
"defaults": {
"store": "yes"
},
"index": "function(doc) { var ret=new Document(); ret.add(doc.body); return ret }"
},
"by_body": {
"defaults": {
"store": "yes"
},
"index": "function(doc) { var ret=new Document(); ret.add(doc.body); return ret }"
}
}
http://localhost:5984/ИМЯ_БАЗЫ/_fti/lucene/by_subj?q=Kill*
то нам найдет все темы которые начинаются с Kill
http://localhost:5984/ИМЯ_БАЗЫ/_fti/lucene/by_body?q=Kill*
то нам найдет все сообщения которые начинаются с Kill
Теперь добавляем поддержку в CouchRest
в своей модели добавьте метод (аля MonkeyPatch) и все.
def self.search(q)
CouchRest.get "http://localhost:5984/ИМЯ_БАЗЫ/_fti/lucene/by_word_solo?q=#{q}"
end
P.S.: если знаете способ красивее то предлагайте, а я расскажу всем.