Fulltext v Ruby on Rails a Apache Solr
Fulltextové vyhledávání je příkladem technologie, kterou řešíme téměř v každé aplikaci. Požadavky a vize systému určují složitost celého řešení a naším cílem je použít nejjednodušší možné řešení.
Pro jednoduché a zlehka používané aplikace můžeme “fulltext” řešit jednoduchými SQL dotazy typu “SELECT * FROM contacts WHERE name LIKE ‘neco%’”, což není žádná ostuda, pokud to aplikaci a klientovi stačí.
Pokud tvoří fulltext páteř našeho systému, nebo máme požadavky na vyhledávání typu “chceme synonyma”, “váhy”, “vyhledávat v obsahu dokumentů” a nám se nepodaří klienta přesvědčit, že to opravdu nepotřebuje, musíme použít skutečný fulltext, čímž si zajistíme práci na několik týdnů či měsíců. Kvalitní fulltextové vyhledávání je složitý problém, který je vždy o kompromisech.
Nejdříve doporučuji zkusit fulltext, který nabízí přímo relační databáze. Například v PostgreSQL je to modul TSearch, který je od verze 8.3 přímo součástí databáze a nemusí se instalovat externě. TSearch lze nakonfigurovat tak, aby používal české a slovenské slovníky z Open Office, řešil stemování (převod slova na kořen), stoplist, apod. Integrace s databází nám zároveň vyřeší spoustu nepříjemných problémů jako přístupová práva k objektům (chci vyhledat pouze dokumenty, ke kterým má určitý uživatel právo), stabilitu, nezávislost na další vrstvě, testování, apod. Konkrétně s TSearch mám vynikající zkušenosti. Pokud můžete a neočekáváte mnoho, použijte databázový fulltext.
Jestliže potřebujeme vyhledávání dle částí slov, wildcards na začátku či na konci, podrobné váhy, n-gramy, škálování, distribuované vyhledávání, zřejmě musíme použít externí řešení a náš fulltext delegovat na něj. Google je nám tady vhodnou inspirací, ke které se můžeme blížit.
Přestože jsem railsista, jsem také javista, takže znám Apache Lucene. Perfektní a enormně složitá technologie, jejíž ovládnutí sice znamená několik měsíců těžkého studia, ale dokážete z ní těžit několik let. Na vlastní implementaci v Lucene zapomeňme, je to objevování kola a zbytečná práce. Pokud chceme řešení v Javě a používáme Hibernate, pak vřele doporučuji Hibernate Search, který jsem zkusil se skvělými výsledky.
HTTP servletem nad Lucene je Apache Solr, skvělá technologie, která nás odstíní od složité práce se samotným Lucene a s indexem pracuje přes HTTP požadavky. Protože HTTP lze použít snad z každého normálního jazyka, máme řešení, které je nezávislé na použitém programovacím jazyce či frameworku. Samotný Solr je stále docela složitý, ale poskytne nám mnoho. Doporučuji zakoupit knihu [SOLR] a prostudovat ji. Minimálně tím získáte přehled, co je možné a co raději nechceme.
Pro napojení Apache Solr na Ruby on Rails lze použít plugin acts_as_solr a mít super fulltext v aplikaci v řádu minut.
1. Instalace pluginu
script/plugin install git://github.com/mattmatt/acts_as_solr.git
2. Nastartujeme Solr
rake solr:start
Solr by teď měl odpovídat na ttp://localhost:8982/solr/, kde najdeme přehledné admin rozhraní.
3. Integrace do modelu
class Address < ActiveRecord::Base
#z modelu chceme indexovat ulici, město, psč
acts_as_solr :fields => [:street, :town, :zip]
end
Od teď se při každém save adresy provede zápis do Lucene indexu v Solr.
4. Reindex
Pokud máme plnou databázi a chceme reindexovat všechny modely najednou, v console spustíme:
Address.rebuild_solr_index
5. Používání
Address.find_by_solr("Praha")
Solr umí také vyhledávat přes více modelů najednou, používat wildcards, facets, syntax highlighting, našeptávat, apod. Zájemce odkazuji na zdroje pod článkem.
I když plugin acts_as_solr vypadá opravdu jednoduše, je vhodné nastudovat minimálně doporučený [SOLR] a ještě lépe [LUCENE]. Musíme mít na paměti, že pokud si Solr pustíme do infrastruktury, budeme s ním muset pracovat a podporovat ho řadu let, takže je třeba vědět, jak vlastně technologie funguje. Minimálně pro debugování, až jednoho dne fungovat přestane :).
Zdroje:
- [SOLR] - David Smiley, Eric Pugh, Solr 1.4 Enterprise Search Server, PACKT Publishing, 2009, ISBN: 1847195881. Dostupný z WWW: https://www.packtpub.com/solr-1-4-enterprise-search-server/book
- [LUCENE] - Michael McCandless, Erik Hatcher, and Otis Gospodnetić, Lucene in Action, Second Edition, Manning Publications Co., 2010, ISBN: 1933988177. Dostupný z WWW: http://www.manning.com/hatcher3/