Volltextrecherche und mehr: Wozu man ORACLE TEXT nutzen kann

Werbung
,QVHUW3LFWXUH+HUH!
9ROOWH[WUHFKHUFKHXQGPHKU
:R]XPDQ25$&/(7(;7QXW]HQNDQQ
'RNXPHQWH%LOGHUXQGPHKULP$OOWDJ
(LQLJH$QIRUGHUXQJHQ
y *LEPLUDOOH'DWHQ%LOGHUXQG'RNXPHQWH]XP
%DXWHLODGDVLP3URGXNW=LP-DKU
HLQJHVHW]WZXUGH
y :RILQGHLFKGDV9LGHR7RQ'RNXPHQW]XU5HGH
XQVHUHV9RUVWDQGHVDXIGHUOHW]WHQ7DJXQJLQ"
y ,FKEUDXFKHDOOH%LOGGRNXPHQWH]XP
3URGXNWLRQVSUR]HVV;<LP)RUPDW*,)± DEHU
YHUNOHLQHUW
y :LHKLH‰HQQRFKGLH6SUHDGVKHHWVXQG
'RNXPHQWHGLHLFK]XP7KHPHQEHUHLFK±
Ä$QZHQGXQJVHQWZLFNOXQJ³HUVWHOOWKDWWH"
'DWHQRUJDQLVDWLRQ
1LFKWUHODWLRQDOH'DWHQ
y Viele Datenhaltungs-Systeme
y Große Aufwände zur Integration
y Interaktion sehr langsam
6WUXNWXULHUWH'DWHQ
7H[WGRNXPHQWH
DQGHUH'DWHQ
2UDFOH7(;7
7UHIIHUOLVWH
2UDFOH7(;7
,QGL]LHUXQJ
y Unterstützung aller gängigen Datentypen
–
–
XMLTYPE, VARCHAR2, CLOB, BLOB, ...
Filter bei Binärdaten möglich
y Auch mehrere Indizes pro Tabelle
64/!FUHDWHLQGH[LG[BWH[WLQGH[
RQGRNXPHQWBWDEGRNXPHQW
LQGH[W\SHLV&7;6<6&217(;7
,QGH[FUHDWHG
+,17(5*581'
• ([WHQVLEOH,QGH[LQJ)UDPHZRUN
• 6SDWLDO7(;7([SUHVVLRQ)LOWHU
• (LJHQH,QGL]HVP|JOLFK
2UDFOH7(;7
9ROOWH[WUHFKHUFKH
y Abfrage mit SQL
–
CONTAINS-Funktion
Kombinierbar mit relationalen Abfragen
–
SCORE()-Funktion
–
Highlighting
"Keyword-in-Context"
–
y Relevanz-Ranking anhand Wort-Häufigkeiten
y Ergebnis-Aufbereitung
–
VHOHFWVFRUHGRNXPHQW
IURPGRNXPHQWBWDE
ZKHUH&217$,16GRNXPHQW
6RIWZDUH$1'2UDFOH
!
2UDFOH7(;7
$EIUDJHP|JOLFKNHLWHQ
y Exakte Wort/Phrasensuche
ZKHUHFRQWDLQVWH[W¶+XQG·!
y Logische Kombinationen
ZKHUHFRQWDLQVWH[W¶+XQG$1'.DW]H·!
y Wildcard-Suche
ZKHUHFRQWDLQVWH[W¶+XG$1'.DWBH·!
y Soundex
ZKHUHFRQWDLQVWH[W¶6P\WKH· !
y Fuzzy matching
ZKHUHFRQWDLQVWH[W¶"+XQW·!
y Multilinguale Stammsuche
ZKHUHFRQWDLQVWH[W¶OlXIW·!
2UDFOH7(;7
$EIUDJHP|JOLFKNHLWHQ
y NEAR-Operator
ZKHUHFRQWDLQVWH[W¶QHDU+XQG.DW]H·!
y Suche in Sektionen, Sätzen und Paragraphen (XML)
ZKHUHFRQWDLQVWH[W¶+XQG:,7+,17,7(/·!
Score-bezogene Funktionen
ZKHUHFRQWDLQVWH[W¶+XQG0,186.DW]H·!
ZKHUHFRQWDLQVWH[W¶+XQG25.DW]H·!
y Score-bezogene Operationen auf Ergebnislisten
ZKHUHFRQWDLQVWH[W¶+XQG·!
y ISO 2788 konformer Thesaurus
ZKHUHFRQWDLQVWH[W¶6<1+XQG>WKHV@·!
2UDFOH7(;7
,QGL]LHUXQJVSUR]H‰
y Eigene Implementierungen möglich
)LOWHU
6HFWLRQHU
$872B),/7(5
/H[HU
%DVLF± :KLWHVSDFH
3ODLQ7H[W
+70/
;0/
1HZV(0DLO
7KHPHQ(QJLQH
'HFRPSRXQGLQJ
DOWHUQDWHVSHOOLQJ
2UDFOH7(;7
'DWHQTXHOOHQ
y
y
y
y
y
DIRECT_DATASTORE
MULTICOLUMN_DATASTORE
FILE_DATASTORE
URL_DATASTORE
86(5B'$7$6725(
*UXQGODJHQ
$XIEDXHLQHV7(;7,QGH[
y DR$[Indexname]$I
–
7RNHQ7DEHOOH: Enthält alle Tokens mit (binären)
Informationen über die Dokumente, in denen sie
vorkommen.
y DR$[Indexname]$R
–
Mapping-Tabelle DOCID Æ ROWID
–
Mapping-Tabelle ROWID Æ DOCID
–
1HJDWLYOLVWH: Enthält alle gelöschten DOCID's
y DR$[Indexname]$K
y DR$[Indexname]$N
$XIEDXHLQHV2UDFOH7(;7,QGH[
7RNHQ7DEHOOH,
y Tabellenaufbau
1DPH1XOO"7\SH
72.(1B7(;712718//9$5&+$5
72.(1B7<3(12718//180%(5
72.(1B),56712718//180%(5
72.(1B/$6712718//180%(5
72.(1B&281712718//180%(5
72.(1B,1)2%/2%
$XIEDXHLQHV2UDFOH7(;7,QGH[
7RNHQ7DEHOOH,
y Eine Ausgangssituation
52:,'
$$$6:7$$)$$$&*$$&R
52:,'
'2&,'
$$$6:7$$)$$$&*$$&
'2&,'
,'7(;7
1DFKWXQG7DJ7DJXQG1DFKW
(VZDUHLQHVWUPLVFKH1DFKW
72.(1B7(;772.(1B,1)2%/2%
1$&+7'2&,',1)2'2&,',1)2
7$*'2&,',1)2
67h50,6&+('2&,',1)2
2UDFOH7(;7
9HUKDOWHQEHL'0/
y Besonderheit ...
–
–
Idealfall: In-Place-Pflege in der Token-Tabelle
Aber: Zu teuer!
y Daher:
–
–
–
INSERT:
DELETE:
UPDATE:
PENDING-Tabelle
Negativliste
DELETE und INSERT
y Zusätzliche Aufgaben:
–
–
Index-Synchronisierung
Index-Optimierungen
2UDFOH7(;7
9HUKDOWHQEHL'0/
y Indexsynchronisierung
–
–
Manuell, Job-Gesteuert, ON_COMMIT
=XVlW]OLFKTRANSACTIONAL-Parameter
y Dictionary Views
–
–
CTX_USER_PENDING
CTX_PENDING
Aktualität
Fragmentierung
2UDFOH7(;7
(LQLJH7LSSV
y Indizierung
–
–
–
Ausreichend Speicherplatz bereitstellen
y Parameter MEMORY
Geeignete Synchronisierung wählen
Index regelmäßig optimieren
y CTX_DDL.OPTIMIZE_INDEX
y Abfragen
–
Logische Operatoren (AND, NOT, OR) ...
... auf CONTAINS-Ebene ...
... nicht auf SQL-Ebene ...
verwenden!
2UDFOH7(;7J
0HKU3HUIRUPDQFH&RPSRVLWH 'RPDLQ,QGL]HV
y Optimierung für 0L[HG4XHULHVund
6RUWLHUXQJHQ
&5($7(,1'(;P\LQGH[ RQGRFVWH[W
,1'(;7<3(LV &7;6<6&217(;7
),/7(5%<FDWHJRU\SXEOLVKHUSXEBGDWH
25'(5%<SXEBGDWHGHVF
y Sortierung und Filtern werden direkt
im TEXT-Index durchgeführt
2UDFOH7(;7J
0HKU3HUIRUPDQFH&RPSRVLWH 'RPDLQ,QGL]HV
y Beispiel für eine Mixed Query
VHOHFW URZLGIURPGRFV
ZKHUHFRQWDLQVGRN
7DJ
! DQG
SXEBGDWHEHWZHHQ DQG
3ODQPLW &RPSRVLWH 'RPDLQ,QGH[
3ODQRKQH&RPSRVLWH 'RPDLQ,QGH[
2UDFOH7(;7DQGHUVJHQXW]W
8QVFKDUIH$GUHVVVXFKH
y Anforderung
–
–
Adressen sind vielfach falsch geschrieben
Suche anhand verschiedenster Kriterien
y Ansatz
–
–
(LQIndex auf alle Adress-Spalten
Nutzung der linguistischen Features
Tokenizer, Fuzzy-Suche
8QVFKDUIH$GUHVVVXFKHPLW2UDFOH7(;7
y Datentabelle am Beispiel: ADRESSEN
64/!VHOHFW
&867B),567B1$0(__
__&867B/$67B1$0(&867B1$0(
&867B675((7B$''5(66__
__&867B&,7<&867B$''5(66
IURPVKFXVWRPHUV
&867B1$0(&867B$''5(66
/LVD+DJDQ1RUWK+ROO\ZRRG'ULYH$UEXFNOH
$LGDQ'RZG6RXWK7RP*UHHQ&LUFOH0RQWDUD
5KRGD*UDLOLQJ6RXWK%HFNHU$YHQXH)HUUDOVOHV0RQWDJQHV
7UHQW/DXHUV5RZDQ5RDG7UDOHH
5H[IRUG&ROH:HVW%HDU/DNH$YHQXH-RLQYLOOH
%UDQGHQ%DULORFKH
3LWWV\OYDQLD&RXUW6DQ&DUORVGH
*DVWRQ:HEEHU1RUWK0LGODQG$YHQXH:LJDQ
2ULHQH3HHEOHV%ODFN6DQG%HDFK$YHQXH'XUEDQ
9DOHULDQD&RQDUG:HVW/DID\HWWH$YHQXH6\UDFXVH
+HWW\&DUSHQWHU(DVW0DUVKODQG'ULYH&DQWRULD
&DO,QJROG1RUWK7RRHOH%RXOHYDUG6XJDUORDI.H\
9RUJHKHQVZHLVH
86(5B'$7$B6725(
y DIRECT_DATASTORE
–
Die zu indizierenden Dokumente werden
direkt aus der Tabelle geholt
7DEHOOHPLW
'RNXPHQWHQ
,QGH[(QJLQH
9ROOWH[WLQGH[
9RUJHKHQVZHLVH
86(5B'$7$B6725(
y USER_DATASTORE
–
Eine PL/SQL-Prozedur liefert die zu
indizierenden Daten ...
7DEHOOHQ
3/64/
3UR]HGXU
,QGH[(QJLQH
9ROOWH[WLQGH[
(LQULFKWHQGHV8VHU'DWD6WRUH
1. Suchtabelle erstellen
–
–
Index wird auf diese Tabelle erzeugt
Daten können aus beliebigen Tabellen kommen
FUHDWH WDEOH FXVWBDGGUHVVBVXFKH
FXVWBLGQXPEHU
VXFKH
FKDU
$XIGLHVH6SDOWH68&+(
ZLUGGHU,QGH[HU]HXJW
LQVHUW LQWR FXVWBDGGUHVVBVXFKH
VHOHFW FXVWBLG
IURP VKFXVWRPHUV
(LQULFKWHQGHV8VHU'DWD6WRUH
2. Trigger erstellen
–
Benachrichtigung der Index-Tabelle bei DML auf
Basisdaten
FUHDWH RU UHSODFHWULJJHU WUBQRWLI\BXSGDWH
DIWHULQVHUW RU XSGDWH RU GHOHWH RQ FXVWRPHUVIRU HDFKURZ
EHJLQ
LI LQVHUWLQJWKHQ
LQVHUW LQWR FXVWBDGGUHVVBVXFKH
YDOXHV QHZFXVWBLG
,16(57LQ%DVLVGDWHQDXI
HQG LI
LI XSGDWLQJWKHQ
,QGH[WDEHOOHEHUWUDJHQ
XSGDWH FXVWBDGGUHVVBVXFKHVHW VXFKH VXFKH
ZKHUH FXVWBLG QHZFXVWBLG
83'$7(LQ%DVLVGDWHQDXI
HQG LI
LI GHOHWLQJWKHQ
,QGH[WDEHOOHEHUWUDJHQ
GHOHWH IURP FXVWBDGGUHVVBVXFKH
ZKHUH FXVWBLG QHZFXVWBLG
'(/(7(LQ%DVLVGDWHQDXI
HQG LI
HQG
,QGH[WDEHOOHEHUWUDJHQ
(LQULFKWHQGHV8VHU'DWD6WRUH
3. PL/SQL Prozedur erstellen
–
–
Zusammenstellen der Daten für den Index
Daten sollten als XML bereitgestellt werden
FUHDWH RU UHSODFHSURFHGXUH DGUHVVHQBVXFKHBXGV
ULG LQ
URZLG
WORELQ RXW 12&23<
FORE
LV
6LJQDWXUGHU3UR]HGXULVW
YBDGUHVVHB[POFORE
EHJLQ
YRUJHJHEHQ
VHOHFW
[POHOHPHQW.81'(B$'5(66(
[POHOHPHQW&867B),567B1$0( &867B),567B1$0(
'DWHQDOV;0/'RNXPHQW
[POHOHPHQW&867B/$67B1$0(&867B/$67B1$0(
]XVDPPHQVWHOOHQ
JHWFOREYDOLQWR YBDGUHVVHB[PO
IURP FXVWRPHUVFFXVWBDGGUHVVBVXFKHFV
ZKHUH FVFXVWBLG FFXVWBLGDQG FVURZLG ULG
(LQULFKWHQGHV8VHU'DWD6WRUH
3. PL/SQL Prozedur erstellen
–
–
Zusammenstellen der Daten für den Index
Daten sollten als XML bereitgestellt werden
FUHDWH RU UHSODFHSURFHGXUH DGUHVVHQBVXFKHBXGV
ULG LQ
URZLG
WORELQ RXW 12&23<
FORE
LV
GEPVBOREFRS\
GHVWBORE
!WORE
VUFBORE
!YBDGUHVVHB[PO
;0/'RNXPHQWLQGHQ
DPRXQW
!'EPVB/RE*HW/HQJWKYBDGUHVVHB[PO
GHVWBRIIVHW
! 287/2%NRSLHUHQ
VUFBRIIVHW
!
HQG
(LQULFKWHQGHV8VHU'DWD6WRUH
4. Index parametrisieren
–
–
USER DATASTORE konfigurieren
Andere Parameter hier nicht betrachtet
EHJLQ
FW[BGGOFUHDWHBSUHIHUHQFH
35()(5(1&(B1$0( !
$'5(66(1B8'6B35()
2%-(&7B1$0(
!
XVHUBGDWDVWRUH
FW[BGGOVHWBDWWULEXWH
35()(5(1&(B1$0( !
$'5(66(1B8'6B35()
$775,%87(B1$0(
!
352&('85(
(UVWHOOWH3/64/3UR]HGXU
$775,%87(B9$/8( !
$'5(66(1B68&+(B8'6
KLHUDQJHEHQ
HQG
(LQULFKWHQGHV8VHU'DWD6WRUH
5. Index erzeugen
–
–
USER DATASTORE konfigurieren
Andere Parameter hier nicht betrachtet
&UHDWH LQGH[ DGUHVVHQBLG[RQ FXVWBDGGUHVVBVXFKHVXFKH
LQGH[W\SHLV FW[V\VFRQWH[W
SDUDPHWHUV
GDWDVWRUH$'5(66(1B8'6B35()
VHFWLRQJURXS&7;6<6$872B6(&7,21B*5283
'DWHQNRPPHQDXVGHP
'DWHQOLHJHQDOV;0/YRU
86(5B'$7$6725(
GHU,QGH[VROOGDV
EHUFNVLFKWLJHQ
1XW]HQGHVQHXHQ,QGH[
5. Normale Abfrage
–
Alle Kunden, die aus der Stadt Ingolstadt kommen ..
VHOHFW
FVFXVWBLG
FFXVWBODVWBQDPH
FFXVWBFLW\
IURP FXVWBDGGUHVVBVXFKHFVFXVWRPHUVF
ZKHUH FVFXVWBLG FFXVWBLG
DQG FRQWDLQVVXFKH
,QJROVWDGWZLWKLQ&867B&,7<
!
,QJROVWDGWPXVVLP7DJ
&867B&,7< GHVYLUWXHOOHQ
;0/'RNXPHQWHVVWHKHQ
1XW]HQGHVQHXHQ,QGH[
5. Abfrage auf DOOHFelder
–
–
Alle Kunden, deren Adressen LUJHQGZRIngolstadt"
beinhalten ...
Ausführung mit HLQHPIndex (dem Textindex)
VHOHFW
FVFXVWBLG
FFXVWBODVWBQDPH
FFXVWBFLW\
IURP FXVWBDGGUHVVBVXFKHFVFXVWRPHUVF
ZKHUH FVFXVWBLG FFXVWBLG
DQG FRQWDLQVVXFKH
,QJROVWDGW
!
1XW]HQGHVQHXHQ,QGH[
5. Unscharfe Abfrage auf DOOHFelder
–
–
"Ingolstadt" falsch geschrieben ...
"Fuzzy"-Operator (?)
VHOHFW
FVFXVWBLG
FFXVWBODVWBQDPH
FFXVWBFLW\
IURP FXVWBDGGUHVVBVXFKHFVFXVWRPHUVF
ZKHUH FVFXVWBLG FFXVWBLG
DQG FRQWDLQVVXFKH
",QJOVWDGW
!
:HLWHUH,QIRUPDWLRQHQ
y Oracle Dokumentation: Oracle TEXT
–
KWWSGRZQORDGRUDFOHFRPGRFVFG%B
WH[WEWRFKWP
y Oracle TEXT im OTN
–
KWWSZZZRUDFOHFRPWHFKQRORJ\SURGXFWVWH[W
LQGH[KWPO
y APEX Community
–
KWWSZZZRUDFOHFRPJOREDOGHFRPPXQLW\LQGH[KWPO
Q U E S T I O N S
A N S W E R S
Herunterladen