首页  ·  知识 ·  数据库
ORACLE实现全文检索
网友      编辑:dezai   图片来源:网络
ORACLE 实现全文检索
以下是配置oracle全文检索的方法
用具有sysdba权限的用户登录

SQL> grant ctxapp to market_new;

Grant succeeded.

用户ctxsys登录
SQL> connect ctxsys/lzdyxin
ERROR:
ORA-28000: the account is locked

Warning: You are no longer connected to ORACLE.

用户被锁,解锁
SQL> conn sys/lzdyxin as sysdba
Connected.
SQL> alter user ctxsys account unlock;

User altered.
SQL> connect ctxsys/lzdyxin;
Connected.
SQL> grant execute on ctx_ddl to market_new;

Grant succeeded.


使用应用用户连接

BEGIN
ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer'); --配置词法分析器


--配置储存参数
ctx_ddl.create_preference ('mystore', 'BASIC_STORAGE');
ctx_ddl.set_attribute ('mystore', 'I_TABLE_CLAUSE', 'tablespace index ');
ctx_ddl.set_attribute ('mystore', 'I_INDEX_CLAUSE', 'tablespace indx compress 2 ');
END;

建立索引

create index index_article_content on article_content (article_content)
indextype is ctxsys.context parameters ('lexer my_lexer');

查询方法
把原来的条件改写一下:
普通:where lower(article_content) like '%关键词%'
现在: where contains(article_content,'%关键词%')>0

改后查询报如下错误
ORA-29902: error in executing ODCIIndexStart()
ORA-20000: Oracle Text error
DRG-51030: wildcard query expansion resulted in too many terms

最后发现语法问题,作如下修改
contains(article_content,'%关键词%')>0
contains(article_content,'关键词')>0 ---------取掉'%'

问题解决

索引同步
create or replace procedure cont_sync_index as
begin
ctx_ddl.sync_index('index_article_content');
end;
/

VARIABLE jobno number;

BEGIN
DBMS_JOB.SUBMIT(:jobno,'cont_sync_index();',
SYSDATE, 'SYSDATE + (1/24/4)');
commit;
END;
/

索引优化
create or replace procedure cont_optimize_index as
begin
ctx_ddl.optimize_index('index_article_content','FULL');
end;
/

VARIABLE jobno number;

BEGIN
DBMS_JOB.SUBMIT(:jobno,'cont_optimize_index();',
SYSDATE, 'SYSDATE + 1');
commit;
END;
/

-----完-----
 
 
 
 

这里先给出一个简单示例说利用Oracle Text实现全文检索的方法与步骤,在后面在进行具体的说明。Orcale9i提供了Oracle Text Manager可以简化许多工作,所有在Oracle Text Manager中完成的工作,都可以在通过PL/SQL来实现。要使用Oracle Text,必须具有CTXAPP角色或者是CTXSYS用户。Oracle Text为系统管理员提供CTXSYS用户,为应用程序开发人员提供CTXAPP角色。

CTXSYS用户可执行以下任务:启动Oracle Text服务器,执行CTXAPP角色的所有任务。

具有CTXAPP角色的用户可执行以下任务: 创建索引,管理 Oracle Text 数据字典,包括创建和删除首选项,进行Oracle Text 查询,使用 Oracle Text PL/SQL程序包。

使用Oracle Text的步骤:

(1)创建表来保存某些文档。该示例使用一个主关键字列来标识每个文档,使用一个小的VARCHAR2列来保存每个文档。

CREATE TABLE docs (id NUMBER PRIMARY KEY, text VACHAR2(80));

(2)将两个示例文档置入该表:

INSERT INTO docs VALUES (1,'the first doc');

INSERT INTO docs VALUES (2,'the second doc');

COMMIT;

(3)使用Oracle Text Manager来创建和修改首选项,首选项将与索引相关联。

(4)使用Oracle Text Manager创建文本索引。另外,可以输入以下使用默认首选项的 SQL 语句:

CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;

(5)使用 CONTAINS 函数,发出基于内容的文档查询。例如:

SELECT id FROM docs WHERE CONTAINS (text, 'first') > 0;

这将在文本列包含单词 first (即文档1) 的 docs 中查找所有行。语句中的>0部分是有效的Oracle SQL所必需的,Oracle SQL不支持函数的布尔返回值。

以上只是一个简单的示例,旨在给出使用Oracle Text建立全文索引的完整步骤,归纳起来如下:

(1)建表并装载文本(包含带有需要检索的文本字段)

(2)配置索引

(3)建立索引

(4)发出查询

(5)索引维护:同步与优化(将在后面介绍)

本文作者:网友 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读