2016-03-27 2 views
1

Ich habe eine Spalte mit durch Komma getrennten Zahlen wie '2323,23323,23323'. Die Tabelle hat 20 Millionen Datensätze und dauert etwa 37 Sekunden, um ein Ergebnis basierend auf einem ähnlichen Keyword wie unten anzuzeigen.Wie man eine kommaseparierte Textspalte mit Oracle Text indiziert

SELECT count(*) from testtable WHERE node_sequence like '%324%'; 

Ich habe versucht, die Abfrage der Zeit Text mithilfe von Oracle zu verbessern, indem die unter Index erstellen

CREATE INDEX node_sequence_index ON testtable(node_sequence) INDEXTYPE IS ctxsys.context; 
exec ctx_ddl.sync_index('node_sequence_index'); 

Aber das unten stehende Abfrage funktioniert nur mit Worten:

SELECT count(*) from testtable WHERE CONTAINS(node_sequence, '324') > 0; 

von bei der Suche Dokumentation, wird die Indizierung nach Wörtern (getrennt durch Leerzeichen) Gibt es eine Möglichkeit, mit Komma zu Tokenisieren? Ich konnte keine Probe finden, wo dies möglich ist. Bitte helfen Sie mir zu verstehen, was ich hier vermisse?

+0

Sie könnte eine String-Ersetzungsfunktion für node_sequence hinzufügen, um das Komma loszuwerden. –

+0

Ja, aber ich möchte sehen, ob dies möglich ist, ohne das Komma zu ersetzen. Das Ersetzen wird viele Änderungen in den referenzierten Orten verursachen – Chandan

Antwort

3

Sie müssen Ihren eigenen Lexer mit den gewünschten Parametern erstellen und einstellen (documentation).

So etwas (sorry, nicht getestet):

begin 
    ctx_ddl.create_preference('comma_lexer', 'BASIC_LEXER'); 
    ctx_ddl.set_attribute('comma_lexer', 'PRINTJOINS', '''()/^&"'); 
    ctx_ddl.set_attribute('comma_lexer', 'PUNCTUATIONS', ',.-?!'); 
end; 
/

create index node_sequence_index 
    on testtable(node_sequence) 
    indextype is ctxsys.context 
    parameters ('lexer comma_lexer') 
; 

aktualisieren

-Code von Kommentar von @Chandan, die für Bedingungen arbeitet in der Frage erwähnt:

begin 
    ctx_ddl.create_preference('comma_lexer', 'BASIC_LEXER'); 
    ctx_ddl.set_attribute('comma_lexer', 'WHITESPACE', ','); 
    ctx_ddl.set_attribute('comma_lexer', 'NUMGROUP', '#'); 
end; 
/

create index node_sequence_index 
    on testtable(node_sequence) 
    indextype is ctxsys.context 
    parameters ('lexer comma_lexer') 
; 
+0

beginne ctx_ddl.create_preference ('comma_lexer', 'BASIC_LEXER'); ctx_ddl.set_attribute ('comma_lexer', 'WHITESPACE', ','); ctx_ddl.set_attribute ('comma_lexer', 'NUMGROUP', '#'); Ende; create index node_sequence_index auf testtable (node_sequence) Indextyp ist ctxsys.context Parameter ('lexer comma_lexer'); – Chandan

+0

Der obige Code im Kommentar funktionierte für mich. Ich musste die NUMGROUP durch einen beliebigen Wert wie '#' ersetzen, da die Zeichenfolge '4677, 455555, 455555, 555555, 5555' als eine einzige Zahl betrachtet wurde, da das Komma als Standard-Nummerngruppe verwendet wurde. – Chandan

Verwandte Themen