以下是配置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)索引维护:同步与优化(将在后面介绍)