Oracle全文检索是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle全文检索是啥意思?相关的知识,希望对你有一定的参考价值。

我想查询数据库中某张表里的任意字段包含某指定字符的记录,是用全文检索工具吗?根据网上查的全文检索的配置和操作,好像是根据某字段建立全文索引后,再根据这个索引进行全文检索,那这样的意思是不是只在某个字段中查找指定字符,而非全部字段?
如果全文检索工具跟我想要的查询不是一回事,那我想要的查询要怎么实现呢?sql语句怎么写?

全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。

判断检索效果的两个指标:

查全率=被检出相关信息量/相关信息总量(%)

查准率=被检出相关信息量/被检出信息总量(%)

Oracle全文检索配置方法:

1.检查数据库是否具有全文检索功能(这是针对已经建成使用的数据库)

查看用户中是否存在ctxsys用户,查询角色里是否存在ctxapp角色。以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。

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

2.若没有,则需要手动建立,先建立全文检索要使用的空间

sqlplus / as sysdba  --进入控制台

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

3.创建全文检索使用的用户和角色及相应的包,则需要执行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用户处于解锁状态。

4.创建完成后,要登录ctxsys用户

connect ctxsys/ctxsys

执行以下脚本:@?/ctx/admin/defaults/drdefus.sql(这是个很重要的脚本,后面创建索引会使用该脚本创建的信息)

5.创建全文索引语法分析器

先要明确使用全文索引的用户,我要使用全文索引的是sgpm用户

因此

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

connect sgpm/sgpm

设置语法分析器:

exec ctx_ddl.drop_preference(\'chinalexer\');
exec ctx_ddl.create_preference(\'chinalexer\',\'chinese_lexer\');
设置词法属性:exec ctx_ddl.drop_preference(\'idx_c_store\');
begin
ctx_ddl.create_preference(\'idx_c_store\',\'BASIC_STORAGE\');
ctx_ddl.set_attribut(\'idx_c_store\',\'I_TABLE_CLAUSE\',\'tablespaces  Idx_ctxsy\');
ctx_ddl.set_attribute(\'idx_c_store\',\'I_INDEX_CLAUSE\',\'tablespace  Idx_ctxsy compress 2\');
end;
/

6.创建索引

create index sgpm.idx_c_cons_name on sgpm.c_cons(cons_name) indextype is ctxsys.context parameters(\'lexer chinalexer storage idx_c_store\');

7.同步索引

variable jobno number;
begin
dbms_job.submit(:jobno,\'pkg_sp_tools.p_cont_sys_index();\',sysdate,\'trunc(sysdate)+19/24+1\');  --执行的是个性化方法。
end;
/

普通的就是用: 

exec ctx_ddl.sync_index(\'idx_c_cons_name\');

到此,全文检索创建成功,contains函数就可以正常使用了。

注意:创建的过程中会出现ORA-29879:cannot create multiple domain index on a column listusing same indextype ,这说明在其他用户下已经建立了该索引。

参考技术A 你这里的全文检索,我的理解就是全表扫描。
你要查询某个表里面的数据,全表的话,语句简单:
select * from table_name;
至于建立索引,如果你的表里面的列值选择性低,那可以在这个列上面创建索引,索引的结构你可以这样理解:
索引列的值+rowid
rowid指向存储这个记录的物理块,oracle根据rowid去找数据的话更快。
oracle会自动选择是全表扫描还是索引扫描,你不需要去管他,你需要那些列,就查那些列就是了。追问

select * from table_name并没有加条件搜索我指定的关键字啊;至于索引的问题你说的太深奥我理解不了,我试了在好几个字段上建立全文索引都不成功。

参考技术B 可以让多个字段组合起来进行查询的搜索方式,类似百度的那种,

以上是关于Oracle全文检索是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

pg建表语句中pg_catalog.default是啥意思

java语言中的scanner是啥意思用来干嘛

reference 是啥意思啊?

LINQ to SQL模型 是啥意思

李白的静夜思全文是啥?

索引表是啥意思