2016-03-27 5 views
1

「2323,23323,23323」のようなコンマで区切られた数字の列があります。テーブルには2000万レコードあり、以下のようなキーワードに基づいて結果を返すのに約37秒かかります。見ることによってOracleテキストを使用してコンマ区切りのテキスト列を索引付けする方法

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

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

は、私は言葉だけで動作し、以下の指標

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

しかし、以下のクエリを作成して、Oracleのテキストを使用してクエリ時間を改善しようとしました索引付けは単語単位でトークン化されます(スペースで区切られます)。コンマでトークン化する方法はありますか?私はこれを行うことができるサンプルを見つけることができませんでした。何が私はここで行方不明を理解するのを助けてください?

+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の'、 '#'); end; create index node_sequence_index testtable(node_sequence) インデックスタイプはctxsys.contextです パラメータ( 'lexer comma_lexer'); – Chandan

+0

コメントの上のコードは私のために働いた。私が原因カンマがデフォルトのnumgroupのに使用されることに、単一の番号として検討された文字列「4677,45555,45555,55555,5555」は「#」のような任意の値でnumgroupのを交換しなければなりませんでした。 – Chandan