--第一步:解锁 ctxsys 进入system用户
alter user ctxsys account unlock;
--第二步:赋予目标用户ctx_ddl包操作权限
grant execute on ctx_ddl to testuser;
--第三步:创建分词器
BEGIN
ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
--ctx_ddl.drop_preference('my_lexer');--删除分析器
END;
--第四步:创建过滤词组
BEGIN
ctx_ddl.create_stoplist('my_stoplist');
END;
--创建过滤词组成功以后,需要自定义需要过滤的词组
BEGIN
ctx_ddl.add_stopword('my_stoplist','有限公司');
ctx_ddl.add_stopword('my_stoplist','股份有限公司');
END;
--第五步:创建索引
--drop index ATTACH_GUARANTEE_INDEX ; --删除索引
--这句话的意思就是,在YU_TEST_INDEX表中的name字段上创建索引,索引类系那个为context类型,该索引用到的分析器为前面定义的my_lexer,该索引用到的过滤词组为前面定义得my_stoplist。
create index ATTACH_GUARANTEE_INDEX on ATTACH_GUARANTEE(ENT_NAME) indextype is CTXSYS.CONTEXT parameters('lexer my_lexer stoplist my_stoplist');
--6.使用索引
select * from ATTACH_GUARANTEE where contains(ENT_NAME,'重庆')>0;
--7、用户输入关键词切词
--删除MY_POLICY
-- BEGIN
--CTX_DDL.drop_policy('MY_POLICY');
--END;
BEGIN
CTX_DDL.CREATE_POLICY('MY_POLICY', LEXER => 'my_lexer');
END;
--写一个oracle函数,来处理关键词切词:
create or replace function p_split_chinese(p_input in varchar2)
return varchar2 as
v_tab CTX_DOC.TOKEN_TAB;
v_return VARCHAR2(323767);
begin
CTX_DOC.POLICY_TOKENS('my_policy',p_input,v_tab);
for i in 1..v_tab.count loop
v_return := v_return || ',' || v_tab(i).token;
end loop;
return LTRIM(v_return,',');
end;
select p_split_chinese('重庆天府') from dual
--8、查询
select count(*) from ATTACH_GUARANTEE WHERE contains(ENT_NAME,p_split_chinese('重庆天府'))>0;
--select count(*) from ATTACH_GUARANTEE WHERE contains(ENT_NAME,'重庆市,重庆,市,天府,重庆市天府')>0;