+ All Categories
Home > Documents > Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující...

Full-textové vyhledávání v PostgreSQL · 2012. 2. 19. · • Najít dokumenty obsahující...

Date post: 16-Dec-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
32
1 Full-textové vyhledávání v PostgreSQL Július Štroffek Revenue Product Engineer Sun Microsystems 1
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

29

Ďekuji.

Page 30: 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

30

Full-textovévyhledávánív PostgreSQL

Július Š[email protected]

30

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

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

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!!!


Recommended