欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle全文检索(like优化)

程序员文章站 2022-07-01 15:30:04
...

一、全文检索词法分析类型

1.basic_lexer

针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。

2.chinese_vgram_lexer

专门的汉语分析器,支持所有汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。

3.chinese_lexer

这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大 提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer.

二、全文检索创建

1.创建词法分析器

begin
	ctx_ddl.create_preference ('词法分析名称');
	ctx_ddl.create_preference ('词法分析名称','chinese_vgram_lexer');--类型
end;

2. 设置词法属性

1)创建词法

begin
	ctx_ddl.create_pfaxureference ('词法名称');
	ctx_ddl.create_pfaxureference ('词法名称','MULTI_COLUMN_DATASTORE');--DATASTORE指定存储类型
end;

2)指定字段(多字段或者单字段)

begin
	ctx_ddl.set_attribute('词法名称','columns','字段1,字段2,字段3,字段4,字段5');
end;

3)其他属性(可查看官方文档)

begin
	ctx_ddl.create_preference('词法名称','BASIC_STORAGE');
	ctx_ddl.set_attribute('词法名称','I_TABLE_CLAUSE','tablespaces  Idx_ctxsy');
	ctx_ddl.set_attribute('词法名称','I_INDEX_CLAUSE','tablespace  Idx_ctxsy compress 2');
end;

3.创建索引

CREATE INDEX indexname --索引名
	ON tablename(字段名称)--表(字段),多字段指定在上方,这里只能指定一个
 INDEXTYPE IS ctxsys.CONTEXT --指定索引类型为全文检索
 PARAMETERS ('LEXER 分析器名称 sync (on commit) DATASTORE 词法名称') ;
 --最后设置全文检索的参数 分析器名称 词法名称,同步更新全文检索sync (on commit)。设置为同步之后就不用单独维护全文检索的更新,不设置同步需单位维护同步,一般为建立job

三、全文检索查询

select * from table_name where contains (column_name,'keyword') >0;

四、删除全文检索

begin

	CTX_DDL.drop_preference('词法分析名称');--删除词法分析器

	CTX_DDL.drop_preference('词法名称');--删除词法
	
end;

drop index indexname;--删除索引

五、其他内容

1.检查数据库是否支持全文检索

查看用户中是否存在ctxsys用户

查询角色里是否存在ctxapp角色。

以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。

即使满足也要查看下用户下有没有相应存储过程,如果没有,也得执行下面操作,可以不见表空间,但必须执行

@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock

@?/ctx/admin/defaults/drdefus.sql

2.手动建立全文检索需要的用户和内容

1)先建立全文检索要使用的空间

sqlplus / as sysdba  --进入控制台

create tablespace Idx_ctxsys datafile '/oradata/sg186fx/ctxsys01.dbf size 10240M autoextend on next 32M maxsize 20480M;--创建全文检索使用的表空间

2).创建全文检索使用的用户和角色及相应的包,则需要执行oracle自带的一个脚本:cd $ORACLE_HOME/ctx/admin/catctx.sql

还是在sqlplus中执行:

@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock

在执行这个脚本的时候,输入了几个参数
第一个参数ctxsys为ctxsys用户的密码

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

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

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

3)创建完成后,要登录ctxsys用户

connect ctxsys/ctxsys

执行以下脚本:

@?/ctx/admin/defaults/drdefus.sql--(这是个很重要的脚本,创建索引会使用该脚本创建的信息)

3.使用contains函数的时候,若没有全文检索会报错的。

4.建立全文检索会创建几个表,如下

oracle全文检索(like优化)