,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 :LHKLHHQQRFKGLH6SUHDGVKHHWVXQG '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 (VZDUHLQHVWUPLVFKH1DFKW 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[WDEHOOHEHUWUDJHQ XSGDWH FXVWBDGGUHVVBVXFKHVHW VXFKH VXFKH ZKHUH FXVWBLG QHZFXVWBLG 83'$7(LQ%DVLVGDWHQDXI HQG LI LI GHOHWLQJWKHQ ,QGH[WDEHOOHEHUWUDJHQ GHOHWH IURP FXVWBDGGUHVVBVXFKH ZKHUH FXVWBLG QHZFXVWBLG '(/(7(LQ%DVLVGDWHQDXI HQG LI HQG ,QGH[WDEHOOHEHUWUDJHQ (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 EHUFNVLFKWLJHQ 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