четверг, 10 сентября 2009 г.

Полнотекстовый поиск в CouchDB, при использовании gem'a CouchRest

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

- ставим git и Maven2, для компиляции couchdb-lucene
# sudo apt-get install git-core maven2

- стягиваем репозиторий couchdb-lucene
# 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.: если знаете способ красивее то предлагайте, а я расскажу всем.

Комментариев нет:

Отправить комментарий