ITPub博客

首页 > 数据库 > Oracle > 初始全文索引-基本的使用

初始全文索引-基本的使用

原创 Oracle 作者:dotaddjj 时间:2012-06-15 00:46:34 0 删除 编辑

全文检索:

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662967