全文检索的建立:
1、开启全文检索查询权限。
解锁:
ALTER USER CTXSYS ACCOUNT UNLOCK;
角色授权:
GRANT CTXAPP TO xxx;
2、创建文本解析器,默认使用chinese_vgram_lexer。
BEGIN
ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
END;
3、创建对应的表字段全文索引。
CREATE INDEX ier_sys_user_zl ON sys_user(zl) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('LEXER my_lexer SYNC (ON COMMIT)');
一般我们语句为: select * from sys_user where contains(zl,'北京')>0 即可查询出我们需要的。
但是有时候会碰到一些特殊Oracle自带的特殊字符:-()&"*%等,就会报错或者查不到想要的内容。
我们也是想了一些办法,最终通过建立函数的方式,先对查询的字符处理下,例如:北京-西门,就会处理成北京\-西门,才能得到我们要查询的内容。
函数如下:
注意下:目前针对&符号还没有测试。
create or replace function pro_replace_char(v_str varchar2) return varchar2 is
v_res varchar2(2000);
begin
v_res:=v_str;
for r in (
select '-' as a from dual
union all
select '(' from dual
union all
select ')' from dual
union all
select '&' from dual
union all
select '"' from dual
union all
select '*' from dual
union all
select '%' from dual
) loop
v_res:=replace(v_res,r.a,'\'||r.a);
end loop;
return v_res;
end pro_replace_char;
然后我们的语句得加上这个函数就不会执行报错或者查不到想要的内容了。
select * from sys_user where contains(zl,pro_replace_char('北京-西门'))>0