应用场景,对千万数据进行多条件搜索时,一般的like,instr效率就很慢,查了一下oracle的全文索引不错,这里简单说明一下中文全文检索的使用
中文全文索引创建
如果再创建时报错,可能是没有权限,用DBA账号登录,赋予登录账号ctx_ddl权限
select t.*, t.rowid from T2_TEMP t for update
SELECT t.id, t.rn FROM (select id,row_number()
over(partition by t1.sroce order by t1.sroce desc) rn from T2_TEMP t1) t where t.rn >1
BEGIN
ctx_ddl.create_preference ('my_chinese_lexer', 'CHINESE_VGRAM_LEXER');
END;
drop index IX_BASE_LEGAL_IDENTITY_NA3
CREATE INDEX zd ON T2_TEMP (name) indextype is ctxsys.context parameters('lexer my_chinese_lexer');
select * from user_indexes;
select * from T2_TEMP t where contains(t.name,'张东')>0
首先创建名称为my_chinese_lexer 的全文索引
BEGIN
ctx_ddl.create_preference ('my_chinese_lexer', 'CHINESE_VGRAM_LEXER');
END;
然后创建表的索引 指向 全文索引(表名和字段名请自己替换)
CREATE INDEX 索引名称 ON 表名 (字段) indextype is ctxsys.context parameters('lexer my_chinese_lexer');
使用
select * from my_table t where contains(t.name,'美国总统 ') >0
其中搜索条件支持通配的查询,多个条件时就用and 连接 如 contains(t.字段,‘美国总统 and 特朗普’)
同时也支持 %如 (‘%美国总统%’),
如果业务场景是存储的大文本的内容,那么可以考虑使用 !,$ , ? , near 等相关通配
不支持特殊字符
这个或许是最关键的,不支持数字,以及中文以外的文字和符号,比如英文 abc 单独搜a可能搜不出来,只所以用可能来描述,是因为有的字母确实搜不出来。但有的单独搜却能搜出来,底层逻辑不得而知,他会把一连串的英文看做为一个字。
数字也是这种情况。特殊字符串也只能转义。
原文:https://blog.csdn.net/rola0418/article/details/79316523
版权声明:本文为博主原创文章,转载请附上博文链接!