Oracle 全文检索


使用 like '%   %',Oracle会进行全表扫描,相当耗费系统资源,这可以使用oracle的全文检索来提高查询速度。

  1. SQL> select * from v$version where rownum = 1;  
  2.   
  3. BANNER  
  4. ----------------------------------------------------------------   
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod  
  6.   
  7. SQL> create table t (text varchar(4000));  
  8.   
  9. 表已创建。  
  10.   
  11. SQL> insert into t values('你那么爱她,为什么不把她留下');  
  12.   
  13. 已创建 1 行。  
  14.   
  15. SQL> begin ctx_ddl.create_preference('club_lexer','chinese_vgram_lexer'); end  
  16.   2  /  
  17.   
  18. PL/SQL 过程已成功完成。  
  19.   
  20. SQL> create index idx_t_text on t(text) indextype is  
  21.   2  ctxsys.context parameters('lexer club_lexer');  
  22.   
  23. 索引已创建。  
  24.   
  25. SQL> select count(*) from t where contains(text,'什么')>0;  
  26. select count(*) from t where contains(text,'什么')>0  
  27. *  
  28. 第 1 行出现错误:  
  29. ORA-29902: 执行 ODCIIndexStart() 例行程序中出错  
  30. ORA-20000: Oracle Text error:  
  31. DRG-10817: CONTAINS  搜索词包含禁用词或禁用词的词组: 什么  
  32.   
  33.   
  34. SQL> select count(*) from t where contains(text,'为什么')>0;  
  35.   
  36.   COUNT(*)  
  37. ----------   
  38.          1  
  39.   
  40. SQL> select count(*) from t where contains(text,'她')>0;  
  41.   
  42.   COUNT(*)  
  43. ----------   
  44.          1  
  45.   
  46. SQL> select count(*) from t where contains(text,'那么')>0;  
  47.   
  48.   COUNT(*)  
  49. ----------   
  50.          1  

定期同步优化索引
  1. SQL> create or replace procedure hsp_sync_index as  
  2.   2   begin  
  3.   3      ctx_ddl.sync_index('idx_t_text');  
  4.   4   end;  
  5.   5   /  
  6.   
  7. 过程已创建。  
  8.   
  9. SQL> --定期同步索引   
  10. SQL> VARIABLE jobno number;  
  11. SQL>  BEGIN  
  12.   2      DBMS_JOB.SUBMIT(:jobno,'hsp_sync_index();',  
  13.   3      SYSDATE, 'SYSDATE + (1/24/4)');  
  14.   4      commit;  
  15.   5   END;  
  16.   6   /  
  17.   
  18. PL/SQL 过程已成功完成。  
  19.   
  20. SQL> create or replace procedure hsp_optimize_index as  
  21.   2      begin  
  22.   3      ctx_ddl.optimize_index('idx_t_text','FULL');  
  23.   4  end;  
  24.   5  /  
  25.   
  26. 过程已创建。  
  27.   
  28. SQL> --定期优化索引   
  29. SQL> VARIABLE jobno number;  
  30. SQL> BEGIN  
  31.   2      DBMS_JOB.SUBMIT(:jobno,'hsp_optimize_index();',  
  32.   3      SYSDATE, 'SYSDATE + 1');  
  33.   4      commit;  
  34.   5  END;  
  35.   6  /  
  36.   
  37. PL/SQL 过程已成功完成。  
在创建同步与优化存储过程前,www.bkjia.com要使用sys用户为evan用户赋权:grant execute on ctx_ddl to evan;
不然会报:
SQL> create or replace procedure hsp_sync_index as
  2   begin
  3      ctx_ddl.sync_index('idx_t_text');
  4   end;
  5   /
警告: 创建的过程带有编译错误。
SQL> show errors
PROCEDURE HSP_SYNC_INDEX 出现错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/5      PL/SQL: Statement ignored
3/5      PLS-00201: 必须声明标识符 'CTX_DDL'
此外还要格外注意一下禁用词。

相关内容