full-textové vyhledávání v postgresql · 2012. 2. 19. · • najít dokumenty obsahující...
TRANSCRIPT
![Page 1: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/1.jpg)
1
Full-textovévyhledávánív PostgreSQL
Július ŠtroffekRevenue Product EngineerSun Microsystems
1
![Page 2: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/2.jpg)
2
Agenda
• Historie• Cíle full-textového vyhledávání• Databázové objekty pro Full-Text Search (FTS)> Datové typy, funkce a operátory> Parsery, šablony, slovníky, konfigurace
• Zpracování prohledávaného textu a dotazů• Vyhledávání a ohodnocování (ranking)• Indexy pro Full-Text Search
![Page 3: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/3.jpg)
3
Historie
• 2000 – 2005 OpenFTS – Open Full Text Search> XWare Team - Oleg Bartunov, Teodor Sigaev, Daniel
Wickstrom> Založen na PostgreSQL, TSearch, TSearch2> PostgreSQL využívá pouze pro ukládání dat
• 2003 – 2007 TSearch2 contrib module> Přesun funkcionality z OpenFTS
• 2008 –> Od verze PostgreSQL 8.3 je FTS součást jádra DB
![Page 4: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/4.jpg)
4
Cíle full-textového vyhledávaní
• Najít dokumenty obsahující zadaná slova• Efektivně vyhledávat ve velkém množství
dokumentů• Zaměřit se pouze na “důležitá” slova• Považovat různé tvary stejného slova
za slova stejná• Umět pracovat s více jazyky• Uživatelská konfigurovatelnost
![Page 5: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/5.jpg)
5
Databázové objekty FTS
• Full-text search poskytuje následující databázové objekty > Parsery – transformace vstupního textu na posloupnost
tokenů; \dFp(+)> Šablony – slovníkové schéma/formát; \dFt(+)> Slovníky – seznam “dvojic” slov pro nahrazení; slova,
která se ignorují – tzv. stop words; \dFd(+)> Konfigurace – parser a posloupnost slovníků; \dF(+)> Datové typy – tsvector, tsquery> Funkce, operátory
• Contrib modul pro kompatibilitu s verzí 8.2
![Page 6: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/6.jpg)
6
Full-Text Search - schéma
![Page 7: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/7.jpg)
7
Datový typ tsvector I
• Reprezentuje prohledávaný dokument• Seznam slov/tokenů vyskytujících se v dokumentu• Může obsahovat pozice slov• Řazení slov podle délky slova a abecedně• Lepší je použít normalizace dle slovníků• Přetypování pomocí ::tsvector
![Page 8: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/8.jpg)
8
Datový typ tsvector II
• Funkce to_tsvector() - normalizace slov dle slovníků
• setweight(tsvector, “char”)> Nastavení váhy pro všechny prvky
• || - sjednocení tsvector-ů
• ... viz. manuál PostgreSQL 8.3
![Page 9: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/9.jpg)
9
Ukázka nastavení vah
select setweight(
to_tsvector('Book Title'),
'A'
) ||
setweight(
to_tsvector('This is a book text'),
'B'
);
![Page 10: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/10.jpg)
10
Datový typ tsquery
• Reprezentuje dotaz nad tsvector-mi
• Použití logických spojek a negace, &, |, !
• Nutná normalizace dle stejných slovníků jako prohledávaný text• Přetypování pomocí ::tsquery
• Funkce to_tsquery()> Vytvoření tsquery s použitím logický spojek &,|,!> Normalizace slov dle slovníků
• Logické operátory &&, ||, !!
![Page 11: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/11.jpg)
11
Datové typy
Ukázky
![Page 12: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/12.jpg)
12
Funkce a operátory IVyhledávání
• Operátory @@, @@@> S Výsledkem je pravdivostná hodnota jestli
dokument vyhovuje zadanému dotazu> Použití @@@ je nutné pro dotaz využívající
GIN index a mající podmínku na ranking• ts_headline()> Zobrazení vyhledávané části v textu
![Page 13: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/13.jpg)
13
Funkce a operátory IIOhodnocování (ranking)
• ts_rank(weights[], tsvector, tsquery, normalization)> Ohodnocení splněnosti dotazu v závislosti na
vzdálenosti hledaných slov v dokumentu• ts_rank_cd()> Používá jinou funkci – tzv. cover density
![Page 14: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/14.jpg)
14
Funkce a operátory
Ukázky
![Page 15: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/15.jpg)
15
Podpora národních jazyků
• Pro různé jazyky musí existovat různé konfigurace zpracování textu v daném jazyce• Všechny funkce zpracovávající texty pro FTS mají
volitelně první parameter – konfiguraci FTS• Pokud není konfigurace uvedena, použije se
výchozí – t.j. get_current_ts_config()
• Parameter - set/show default_text_search_config
• Inicializace dle lc_ctype při initdb, pokud konfigurace s daným jménem existuje
![Page 16: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/16.jpg)
16
Parser
• Standardně dostupný je pouze výchozí• Dělení dokumentu na tokeny několika typů> asciiword, word, numword, asciihword, hword,
numhword, hword_asciipart, hword_part, hword_numpart, email, protocol, url, host, url_path, file, sfloat, float, int, uint, version, tag, entity, blank
• Znaky slova jsou definovány dle nastavení lc_locale na serveru
![Page 17: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/17.jpg)
17
Parser - ladění
• ts_token_type('default')> Vrátí seznam typů tokenů pro daný parser
• ts_parse('default', Document)> Vypíše seznam tokenů a odpovídajících řetězců po
zpracování uvedeného dokumentu daným parserem
![Page 18: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/18.jpg)
18
Parser - ladění
Ukázky
![Page 19: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/19.jpg)
19
Slovníky
• Vyřazují často se vyskytující slova (tokeny)> Mezerové znaky, určité členy, předložky> Pomocné slovesa
• Normalizovat tvar slov> Podst. jména - první pád, slovesa – neurčitek> Zaokrouhlení čísel> Úprava url na zhodný tvar> Nahrazení synonymem
• Výstupem jednoho slova může být i několik slov, tzv. lexémů
![Page 20: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/20.jpg)
20
Vytvoření slovníku – šablony I
• pg_catalog.simple> Obsahuje pouze “stop words”
• pg_catalog.synonym> Obsahuje dvojice slov pro nahrazení (nejen synonyma)
• pg_catalog.thesaurus> Zobecnění synonym pro celé fráze> Musí obsahovat právě jeden podslovník
![Page 21: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/21.jpg)
21
Vytvoření slovníku – šablony II
• pg_catalog.ispell> Konverze z pravopisního slovníku> Pravidla pro generování různých tvarů jsou použita pro
úpravu na základní tvar (kořen)> Problém s úpravou nepravidelných slov – chybí vazba
na základní tvar
• pg_catalog.snowball> Použit pro podporu všech současně podporovaných
jazyků – danish, dutch, english, finnish, french, german, hungarian, italian, norwegian, portuguese, romanian, russian, spanish, swedish, turkish
> Viz http://en.wikipedia.org/wiki/Stemming
![Page 22: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/22.jpg)
22
Slovníky - ladění
• ts_lexize(dictionary, token)> Zobrazí výstup slovníku při zpracování daného tokenu
postgres=# select * from ts_lexize('english_stem', 'cats'); ts_lexize ----------- {cat}(1 row)
![Page 23: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/23.jpg)
23
Konfigurace
• Určuje parser a slovníky, kterými se zpracovávají příslušné dokumenty• Specifikuje mappingy na posloupnosti slovníků pro
různé typy tokenů• Viz \dF+ english
![Page 24: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/24.jpg)
24
Full-Text Search - schéma
![Page 25: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/25.jpg)
25
Ukázka konfiguracepostgres=# \dF+ englishText search configuration "pg_catalog.english"Parser: "pg_catalog.default" Token | Dictionaries -----------------+-------------- asciihword | english_stem asciiword | english_stem email | simple hword | english_stem hword_numpart | simple hword_part | english_stem int | simple ... version | simple word | english_stem
![Page 26: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/26.jpg)
26
Vytvoření slovníku a konfigurace
Ukázky
![Page 27: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/27.jpg)
27
Indexování
• GiST – Generalized Search Tree> Horší škálovatelnost pro velký počet dokumentů
• GIN - Generalized Inverted Index> Indexuje dvojice (lexem, seznam dokumentů)> Dobrá škálovatelnost i pro velký počet dokumentů
CREATE INDEX INDEX_NAME ON TABLE_NAME USING GIN/GIST (COLUMN_NAME);
![Page 28: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/28.jpg)
28
Otázky, dotazy, připomínky...
![Page 29: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/29.jpg)
29
Ďekuji.
![Page 31: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/31.jpg)
31
GiST – Generalized Search Tree
• Pro každý dokument je alokováno bitové pole stejné délky• Každé slovo vyskytující se v dokumentu je
hashováno do tohoto bitového pole• Více slov = stejný bit• Při selekci přes index je nutná kontrola (dělá se
automaticky)• Viz http://en.wikipedia.org/wiki/GiST
![Page 32: Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující zadaná slova • Efektivně vyhledávat ve velkém množství dokumentů • Zaměřit](https://reader033.vdocuments.site/reader033/viewer/2022060821/6099e9f7153e8951fa4586c9/html5/thumbnails/32.jpg)
32
GIN - Generalized Inverted Index
• Indexuje dvojice (lexem, seznam dokumentů)• Pro operátor vyhledání @@ již výsledek
index scanu není kontrolován• Neukládá informaci o vahách a tudíž při uvedení
podmínky používající váhy nutno číst i datové bloky• Pro operátor @@@ je nutno výsledek index scanu
překontrolovat (dělá se automaticky) – nutno použít pokud je použita podmínka na ranking ve where klauzuli!!!