Práce s fullexem v daabázi PosgreSQL 8.0 LUKÁŠ ZAPLETAL PosgreSQL 8.0 je kvaliní, svobodná, relační daabázová plaforma fungující pod unixovými operačními sysémy a nově aké pod OS Windows. Mezi hlavní přednosi paří dobrá podpora SQL sandardů, bohaá škála podporovaných daových ypů, velmi propracovaná ochrana inegriy, dobrá nabídka procedurálních jazyků na sraně serveru a kvaliní dokumenace. Vznikla v 90 leech na univerziě v Berekeley (USA) ehdy jako projek POSTGRES. Projek se posupně vyvíjel až do zcela nového projeku Posgres95, kerý již byl SQL kompaibilní. Záhy byl projek přejmenován na PosgreSQL. PosgreSQL podporuje, podobně jako daabáze Firebird, echnologii MVCC. Aby daabáze zajisila konzisenní sav během jedné ransakce, musí hlída, aby daa nějaký jiný uživael v danou chvíli nezměnil. Toho může docíli různými způsoby (například různé druhy zámků), echnologie MVCC používá akzvanou hisorii záznamů, kdy se podobně jako revizní sysém CVS může vrái ke sarším verzím. Daabáze podporuje pohledy, cizí klíče, ransakce a jednoduchou abulkovou dědičnos. Příklad: CREATE TABLE ciies ( ); name ex, populaion real, aliude in -- (in f) CREATE TABLE capials ( sae char(2) ) INHERITS (ciies); PosgreSQL je SQL-2003 kompaibilní a poskyuje bohaou škálu daových ypů, včeně nesandardních (geomerické a geografické úvary včeně operací s nimi). Mezi hlavní přednosi PosgreSQL je její muligenerační archiekura (MVCC). Konzisence není udržována pomocí zámků (ačkoliv zámky ao daabáze plně podporuje, a o jak na úrovni abulek, ak i záznamů), ale pomocí zpěného udržování hisorie jednolivých záznamů. PosgreSQL nabízí programování na sraně serveru, a o v jak vesavěném jazyku PL/pgSQL, ak i jazycích Tcl, Perl a Pyhon včeně spouší (riggerů). Daabázový server lze velmi snadno rozšiřova, a o nejen o nové daové ypy, ale i o nové jazyky. Exisuje velké množsví
zásuvných modulů, rozšiřující funkčnos (cubes, fuzzy srings, sromy, soundex, XML...) Ve verzi 8.0 najdeme kromě jiného novinky, jako jsou body návrau ransakcí (savepoins), abulkové prosory (ablespaces), průběžné (přírůskové) zálohování a mnoho výkonnosních opimalizací. Modul Tsearch2 Pokud máme nainsalovaný modul, je akivace full-exu hračkou: creaedb es psql es es=# \i /usr/share/pgsql/conrib/search2.sql Skrip zaregisruje a vyvoří pořebné srukury a abulky a akivuje nový daový yp svecor. Přesvědčíme se, jak jsme na om: es=# selec dic_name, dic_commen, dic_iniopion from pg_s_dic; dic_name dic_commen dic_iniopion -----------------+-------------------------------------------------- +---------------------- simple Simple example of dicionary. en_sem English Semmer. Snowball. conrib/english.sop ru_sem Russian Semmer. Snowball. conrib/russian.sop ispell_emplae ISpell inerface. Mus have.dic and.aff files synonym Example of synonym dicionary Vidíme, že skrip zaregisroval několik slovníků, nás ovšem pochopielně zajímá podpora češiny, kerou nyní zavedeme. Nejdřív vyzkoušíme, že funguje semování (vracení kořenů) slov, keré je pro fullexové rejsříkování nejdůležiější: es=# SELECT lexize('en_sem','looking'); lexize -------- {look} Modul umí načís slovník pro ISPELL, což je program z projeku GNU sloužící k auomaické konrole exu. Tyo slovníky nejen že obsahují obrovské množsví českých slov, ale aké všechny jejich vary a základní lexémy. Nejprve zaregisrujeme slovník a soubor se sop slovy: INSERT INTO pg_s_dic ( SELECT 'cz_ispell', dic_ini, 'DicFile="/var/mp/czech.dic", AffFile="/var/mp/czech.aff", SopFile="/var/mp/czech.sop"', dic_lexize FROM pg_s_dic WHERE dic_name='ispell_emplae'); Nyní vše vyzkoušíme:
es=# SELECT lexize('cz_ispell','daabázové'); lexize -------------- {daabázový} Kromě semmingu a sop slov lze aké naimporova synonyma, kerá mohou výsledky hledání vylepši. Soubory se synonymy mají podobný var jako se sop slovy obyčejné exové soubory, co řádek o pojem, mezerou jsou odděleny jednolivé další výrazy. O rozložení exu na jednolivá slova se sará parser. Modul Tsearch2 obsahuje jednoduchý parser, kerý si poradí s obyčejným exem a HTML zdrojovým kódem. Oevřená archiekura umožňuje napsa si vlasní parser. Oesujme jej: es=# SELECT * FROM parse('v daabázích jsou uloženy všechny informace o nás.'); okid oken -------+------------ 1 V 3 daabázích 1 jsou 3 uloženy 3 všechny 1 informace 1 o 3 nás. (16 řádek) Ačkoli je o parser jednoduchý, zvládá specialiy ypu URL adresy nebo e-mailu. A nyní již můžeme přisoupi k vlasní vorbě svekorů a práce s nimi. Nejprve je nuno nasavi parser (kódování a sloník): INSERT INTO pg_s_cfg VALUES ('defaul_czech','defaul','cs_cz'); INSERT INTO pg_s_cfgmap SELECT 'defaul_czech',ok_alias,dic_name FROM pg_s_cfgmap WHERE s_name='defaul_russian'; UPDATE pg_s_cfgmap SET dic_name='{cz_ispell,simple}' WHERE ('ru_sem'=any(dic_name) OR 'en_sem' = ANY(dic_name)) AND s_name='defaul_czech';
Parser nyní funguje správně, lemaizuje slova: es=# selec o_svecor('v daabázích jsou uloženy všechny informace o nás.'); o_svecor ----------------------------------------------------------- 'nás':8 'uloži':4 'všechny':5 'daabáze':2 'informace':6 Nyní již můžeme snadno indexova dokumeny nebo jiné exy: CREATE TABLE dokumeny ( id SERIAL PRIMARY KEY, ex, v svecor); CREATE INDEX idxfti_idx ON dokumeny USING gis(v); CREATE TRIGGER svecorupdae BEFORE UPDATE OR INSERT ON dokumeny FOR EACH ROW EXECUTE PROCEDURE search2(v, ); INSERT INTO dokumeny () VALUES ('Tex dokumenu...'); Díky GIST indexu je nyní možné fullexově vyhledáva pomocí binárního operáoru @@. Ve vyhledávacím doazu je možné použí &, nebo negaci! es=# SELECT FROM dokumeny WHERE v @@ o_squery('oracle'); ------------------------- (1 řádka) es=# SELECT FROM dokumeny WHERE v @@ o_squery('!něco'); ----------------------------- Ale o je PosgreSQL aky!! (2 řádek) es=# SELECT FROM dokumeny WHERE v @@ o_squery('(něco & ješ ě ) server'); ---------------------------------------------- A ješ ě něco, a ť je am nějaká diakriika... Modul Tsearch2 poskyuje jednoduchou implemenaci fullexu. Je snadno rozšiřielný a díky omu, že se jedná o open-source projek, má i slibnou budoucnos.
Odkazy: hp://www.posgres.org Domovská sránka projeku hp://www.sai.msu.su/~megera/posgres/gis/search/v2/ Modul Tsearch2