[Olug-list] Tips: fritekstsøking i PostgreSQL
Denis Braekhus
denis@startsiden.no
Tue, 1 Jul 2003 12:29:43 +0200
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hei og god sommer !
Ser MySQL får litt publisitet rundt sine FULLTEXT indekseringsløsninger.
Tenkte dette er et fint sted å spre det glade budskap om en rimelig super
løsning for mye av det samme (og litt til) i PostgreSQL.
ABC Startsiden har i litt over ett år brukt PostgreSQL med den russiske
søkeløsningen OpenFTS [1] til søk i våre kategorier og pekere.
Nå har den samme duoen bak OpenFTS kommet noen skritt videre på sin nye
versjon av Tsearch (Tsearch V2), en modul som vil bli med i /contrib delen av
PostgreSQL 7.4. For oss som bruker PostgreSQL 7.3.x idag er det fint mulig å
installere og bruke Tsearch V2 allerede nå.
Siden jeg liker å teste slike ting gikk jeg igang for å gjøre en ny database
jeg hadde fritekst-søkbar, via Tsearch V2 [2].
Kort step by step beskrivelse (egentlig bare en oppsummering av
introdokumentasjonen på Tsearch sidene [3]) :
1. Hent ned tarball :
wget [4]
2. Pakk opp tarballen :
tar xfz tsearch-v2.tar.gz
3. Hvis ikke du har kompilert PostgreSQL fra kildekode selv, hent ned og pakk
ut relevante pakker. (For meg ble det Debian sin postgresql unstable
kildepakke.) :
apt-get source postgresql
3. Flytt katalogen til /contrib treet i PostgreSQL kildetreet :
mv tsearch-2.1.6 /..../postgresql-7.3.3/contrib
4. Gå til tsearch katalogen :
cd /..../postgresql-7.3.3/contrib/tsearch-2.1.6/
5. Bygg og installer tsearch.so :
make
make install
I instruksene under tar jeg utgangspunkt i følgende oppsett :
En database som heter : mindatabase
Bruker : minbruker
Tabell : mintabell
Tekstfelt vi skal fritekstindeksere : mittekstfelt
7A. Legg til Tsearch funksjoner og datatyper i relevant database (obs: endel
postgresql reduserer, med god grunn, tilgang til å opprette slikt. Bli derfor
superbruker midlertidig hvis du må det. Se 7B) :
psql -U minbruker mindatabase
\i /..../postgresql-7.3.3/contrib/tsearch-2.1.6/tsearch.sql
7B. Alternativt ved begrenset tilgang :
psql -U postgres mindatabase
\i /..../postgresql-7.3.3/contrib/tsearch-2.1.6/tsearch.sql
ALTER TABLE pg_ts_cfg OWNER TO minbruker;
ALTER TABLE pg_ts_cfgmap OWNER TO minbruker;
ALTER TABLE pg_ts_dict OWNER TO minbruker;
ALTER TABLE pg_ts_parser OWNER TO minbruker;
\c mindatabase minbruker
8. Legg til et FTIindex felt i den aktuelle tabellen :
ALTER TABLE mintabell ADD idxFTI tsvector;
9. Legg inn fritekstsøkeordene i det nye feltet :
UPDATE tblMessages SET idxFTI=to_tsvector('default', mittekstfelt);
10. Støvsug databasen :
VACUUM FULL ANALYZE;
11. Nå må vi lage en index på fritekstfeltet :
CREATE INDEX idxFTI_idx ON mintabell USING gist(idxFTI);
12. Støvsug igjen :
VACUUM FULL ANALYZE;
13. Legg til en Trigger så oppdateringer og nye poster blir fritekstindeksert:
CREATE TRIGGER tsvectorupdate BEFORE UPDATE OR INSERT ON mintabell
FOR EACH ROW EXECUTE PROCEDURE tsearch(idxFTI, mittekstfelt);
14. Nå har du en fritekstsøkbar database (riktignok bare på ett felt, se den
originale guiden for mer info om hvordan å indeksere flere felter av
gangen!), så nå kan vi søke :
SELECT id, mittekstfelt FROM mintabell
WHERE idxfti @@ to_tsquery('default', 'Test');
(Eksempelet over søker på ordet "test".)
Eller søke på flere ord (AND) :
SELECT id, mittekstfelt FROM mintabell
WHERE idxfti @@ to_tsquery('default', 'Test & Tast');
Eller søke på flere ord (OR) :
SELECT id, mittekstfelt FROM mintabell
WHERE idxfti @@ to_tsquery('default', 'Test | Tast');
Hvis noen i det hele tatt hadde noe glede av dette så kan jeg snart fortelle
hvordan man kobler Tsearch V2 opp mot en norsk ordliste, og hvordan man
manipulerer Tsearch konfigurasjonen. Det er på disse områdene Tsearch er
overlegen MySQLs FREETEXT..
:-)
[1] http://openfts.sourceforge.net
[2] http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
[3]
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intr=
o.html
[4] http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/tsearch-v2.tar.gz
- --
Denis Brækhus - ABC Startsiden AS
http://www.startsiden.no
"`The best way to get a drink out of a Vogon is to stick
your finger down his throat...'"
(Hitchhikers Guide To The Galaxy)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/AWKXvsCA6eRGOOARAv2FAJ94dhBbIf95Fue9CF6qyrTzgJLXDQCgs/Em
APhcGXm5lUzJSMMZ4bGK2G4=
=LbuF
-----END PGP SIGNATURE-----