Oracle自带全文索引

前端之家收集整理的这篇文章主要介绍了Oracle自带全文索引前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


使用场景:

当需要在大量文章中通过关键字搜索文章时,Oracle自带的全文索引对于提高搜索性能非常有帮助,并且使用也很方便。


使用前的准备工作:

1、先查看oracle是否自带有ctxsys用户,如果没有该用户则不能使用全文索引功能,必须先手动安装,安装方式很简单,参考下一步;

2、如果自带有ctxsys用户,请忽略该步骤;

(1)dba账号登录sqlPLUS,创建全文索引使用的表空间;

create tablespace textidx datafile '/oradata/textidx/ctxsys.dbf size 10240M autoextend on next 32M maxsize 20480M;

(2)执行oracle自带的脚本:$ORACLE_HOME/ctx/admin/catctx.sql

@?/ctx/admin/catctx.sql ctxsystextidxtemp nolock

第一个参数ctxsys为ctxsys用户的密码;

第二个参数textidx为ctxsys用户要使用的表空间;

第三个参数temp为ctxsys用户使用的临时表空间;

第四个参数nolock为ctxsys用户处于解锁状态。


(3)用ctxsys账号登录并执行脚本

connect ctxsys/ctxsys

执行以下脚本:@?/ctx/admin/defaults/drdefus.sql



正式开始使用全文索引:

1、先授予用户权限,例如:user用户需要执行全文索引;

grant execute on ctxsys.ctx_ddl to user with grant option;


2、设置词法分析器

exec ctx_ddl.create_preference ('my_lexer','chinese_vgram_lexer');

第一个参数:词法分析器的名称,可自行命名;

第二个参数:词法分析器的类型,主要有如下几种类型:

basic_lexer:主要针对英文;

chinese_vgram_lexer:专门用于汉语,支持所有的汉语编码,缺点是机械拆分,

例如:我是程序猿,会被拆分为:我、我是、程序、序猿、是程;

chinese_lexer:新版的汉语分析器,只能用UTF-8的编码,比上面一种更智能,效率更高;

例如:我是程序猿,会被拆分为:我、程序猿;


3、给相应字段建立全文索引,和普通索引一样;
CREATE INDEX content_textidx ON tableName(columnName) indextype is ctxsys.context parameters('lexer my_lexersync(on commit)');

参数lexer: 指定自己使用的词法分析器;

参数sync(on commit): 表示在索引所在的表更新数据的时候就自动更新全文索引库;


4、如果需要给一张表的多个字段一起增加全文索引,例如:搜索一篇文章标题字段包含‘shadon’字符的所有信息,如果给文章增加了多字段的全文索引,可以直接坐到这一点;


在有ctx_ddl执行权限的用户下执行如下脚本:

exec ctx_ddl.create_preference('content_textidx_pref','MULTI_COLUMN_DATASTORE');

exec ctx_ddl.set_attribute(' content_textidx_pref','columns','content,title'); // content和title为表的字段名称,表示为哪些字段建立多字段全文索引;


创建索引:

CREATE INDEX content_textidx ON tableName(columnName)
INDEXTYPE IS ctxsys.CONTEXT PARAMETERS('DATASTORE ctxsys.content_textidx_pref lexer my_lexer sync(on commit)')


注意:多字段全文索引有一个非常大的弊端,就是当title字段更新时,无法同步更新全文索引;但是content字段更新时,会自动更新全文索引。

目前我的做法是通过增加一伪列,这一列包含title和content字段的内容,如果更新title和content的内容,同时更新伪列的内容,并且‘多字段的全文索引’增加到这个伪列上;




全文索引的优化:


同步: 将数据的更新立即同步到全文索引的信息数据表中(如果有时候根据关键字查询不到数据,可以先同步一下。);

脚本:exec ctx_ddl.sync_index ('indexName');


优化: 由于表中的数据会经常更新、删除,而全文索引的信息表不会立即删除,这就需要我们定时的去执行如下脚本。


脚本:exec ctx_ddl.optimize_index('indexName','FULL');


注意事项:

(1)如果前面创建全文索引的时候带上了参数“sync(on commit)”,则同步不需要手工去执行,当数据变动时,会自动进行同步操作;

(2)优化操作一定要放在Job中定时来执行,可以根据数据变动的频率自行决定优化脚本的更新频率;

猜你在找的Oracle相关文章