2016-03-27 152 views
1

我有一列用逗號分隔的數字,如'2323,23323,23323'。該表有2000萬條記錄,大約需要37秒才能根據類似下面的關鍵字返回結果。如何使用Oracle文本索引逗號分隔的文本列

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

我試圖通過使用Oracle文本通過創建以下索引

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

但下面的查詢來提高查詢的時間只用言語工作:

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

通過查看文檔,索引將通過文字標記(分隔空間)。有沒有辦法用逗號來標記?我一直沒能找到一個樣本,可以做到這一點。請幫助我瞭解我在這裏錯過了什麼?

+0

你可以在node_sequence上添加一個字符串替換函數來擺脫逗號。 –

+0

是的,但我想查看這是否可能,而不需要替換逗號。替換會引起參考位置的很多變化 – Chandan

回答

3

您需要使用所需的參數創建和調整您自己的詞法分析器(documentation)。

像這樣的東西(抱歉,未測試):

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') 
; 

更新

代碼從評論由@Chandan該協會致力於在問題中提到的條件:

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

begin ctx_ddl.create_preference('comma_lexer','BASIC_LEXER'); ctx_ddl.set_attribute('comma_lexer','WHITESPACE',','); ctx_ddl.set_attribute('comma_lexer','NUMGROUP','#'); 結束; 創建索引node_sequence_index on testtable(node_sequence) indextype is ctxsys.context parameters('lexer comma_lexer'); – Chandan

+0

評論中的上述代碼適用於我。由於逗號被用作默認numgroup,因此字符串'4677,45555,45555,55555,5555'被視爲單個數字,所以我必須用'#'這樣的任意值替換NUMGROUP。 – Chandan

相關問題