如何使用Oracle文本为逗号分隔的文本列编制索引

9w11ddsr  于 2023-04-05  发布在  Oracle
关注(0)|答案(2)|浏览(148)

我有一列逗号分隔的数字,如'2323,23323,23323'。该表有2000万条记录,需要大约37秒才能返回一个结果的基础上,像下面这样的关键字。

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;

通过查看文档,索引将按单词标记(以空格分隔)。是否有方法按逗号标记?我无法找到可以这样做的示例。请帮助我理解我在这里遗漏了什么?

vsikbqxv

vsikbqxv1#

您需要使用所需的参数创建和调优自己的lexer(文档)。
类似这样的东西(抱歉,未测试):

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

mlmc2os52#

begin 
  ctx_ddl.create_preference('IDX_search', 'BASIC_LEXER');
  ctx_ddl.set_attribute('IDX_search', 'startjoins', ',');
end; 

CREATE INDEX FGK.IDX_CALC_UIDS_search 
  ON tbl_HISTORY (search) indextype 
  is ctxsys.context parameters('lexer IDX_search sync(on commit)');

相关问题