首页 > 数据库 > Oracle > 初始全文索引-基本的使用
全文检索:
Oracle支持全文检索功能,对关键字进行所谓的模糊检索。初次接触全文索引,简单摘要下。
解锁ctxsys用户和授权给user
SQL> alter user ctxsys account unlock;
User altered
SQL> grant execute on ctx_ddl to jhajjql;
授权完成后就可以利用ctx_ddl包来创建lexer,全文检索是通过oracle专利的词法分析器lexer将column中的所有表意单元(oracle称为term)找出来,记录在一组以dr$开头的表中,同时记录term出现的位置,此时,hash值等,检索时就是利用dr$表找出相应的term然后查找相应的数据信息。
Lexer的分类
Basic_lexer:主要针对英文,根据空格和标点将英语单词从句子中分离。不过由于主要适用于英文,形如我们一起的列值,利用我们查找却查找不出来。
Chinese_vgram_lexer:主要针对于中文,会逐步分析形如我们一起,会分析为我 我们 们一 一起 起五种,按字为单元进行分析,效率上比basic_lexer要差点。
Chines_lexer:主要针对于中文,由于分析器可以识别大量的汉语词汇,可以有效的减轻chinese_vgram_lexer带来的性能消耗。有文档提到该lexer需要服务器字符集是utf8,不过测试中发现并不如此。
创建preference然后制定所需索引后续就可以利用全文索引查询了。
SQL> select * from oratext01;
ID NAME
---------- --------------------------------------------------------------------------------
1 学些甲骨文
3 甲骨文小鱼
4 我是小飞鱼
5 搞定mysql
6 学好操作系统
8 真的好想你
9 哎,相思苦
7 rows selected
SQL> execute ctx_ddl.create_preference('xiaoyu_lexer','chinese_lexer');
PL/SQL procedure successfully completed
SQL> create index index_xiaoyu01 on oratext01(name) indextype is ctxsys.context parameters('lexer xiaoyu_lexer');
Index created
SQL> explain plan for select * from oratext01 where contains(name,'甲骨文')>0;
Explained
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2002681706
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CP
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 14 | 4 (
| 1 | TABLE ACCESS BY INDEX ROWID| ORATEXT01 | 1 | 14 | 4 (
|* 2 | DOMAIN INDEX | INDEX_XIAOYU01 | | | 4 (
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CTXSYS"."CONTAINS"("NAME",'甲骨文')>0)
Note
-----
- 'PLAN_TABLE' is old version
SQL> select parameter,value from nls_database_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
可以看出该执行计划确实利用了全文索引,不过全文索引对于这种小型检索用处不大,还远远不如like和instr效率高,全文索引需要定期刷新和维护,这在系统中的消耗同样时不可忽视的,而且全文索引的使用对应用并不是透明,需要通过contains和catsearch、march修改应用。
其实对全文索引的初次接触让我想起了物化视图,一样是用空间换取时间,同样也需要定期刷新视图,如果对性能得不到提升,而盲目的创建物化视图和全文索引,将空间和时间都失去。
由于cxtsys.context索引的定期刷新和维护:
如果不刷新下可以看看
SQL> select * from oratext01 where contains(name,'甲骨文')>0;
ID NAME
---------- --------------------------------------------------------------------------------
1 学些甲骨文
3 甲骨文小鱼
SQL> insert into oratext01 values(10,'甲骨文的那些事');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from oratext01 where contains(name,'甲骨文')>0;
ID NAME
---------- --------------------------------------------------------------------------------
1 学些甲骨文
3 甲骨文小鱼
SQL> delete from oratext01 where id=1;
1 row deleted
SQL> select * from oratext01 where contains(name,'甲骨文')>0;
ID NAME
---------- --------------------------------------------------------------------------------
3 甲骨文小鱼
看出没有刷新该刷新利用全文索引会找不出新插入的行,但是却可以识别出删除的行。
SQL> execute ctx_ddl.sync_index('index_xiaoyu01');
PL/SQL procedure successfully completed
SQL> select * from oratext01 where contains(name,'甲骨文')>0;
ID NAME
---------- --------------------------------------------------------------------------------
3 甲骨文小鱼
10 甲骨文的那些事
刷新后信息正确,由于定期删除和更新需要对全文索引进行碎片整理,其实这个碎片整理的真正含义暂时还没啥透彻的理解方法就是
SQL> execute ctx_ddl.optimize_index('index_xiaoyu01','full');
PL/SQL procedure successfully completed
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1058528/ ,如需转载,请注明出处,否则将追究法律责任。