Oracle Text 学习笔记(11G)<一> :手工建立TEXT

本文详细介绍Oracle Text在Oracle 11G中的手动安装配置步骤,包括创建CTXSYS用户、执行初始化脚本、创建测试用户及权限分配等,并解决创建全文索引过程中遇到的问题。

    根据Oracle Text Application Developer’s Guide,我们首先需要建立一个测试用的用户,然后Grant CTXAPP这个角色给它。

    如果这个角色不存在,会报:

SQL> grant CTXAPP to haozhu;
grant CTXAPP to haozhu
      *
ERROR at line 1:
ORA-01919: role 'CTXAPP' does not exist

    那么如何创建这个角色和其他相关的对象呢?

    从10G开始,我们只需要执行这个SQL脚本即可:$ORACLE_HOME/ctx/admin/catctx.sql

    这个脚本有四个输入参数:

define pass          = "&1"
define tbs           = "&2"
define ttbs          = "&3"
define dolock        = "&4"

    这四个参数其实是传递给在这个脚本里调用的另一个脚本的:

@@ctxsys.sql &pass &tbs &ttbs &dolock

    再打开ctxsys.sql就可以看到这四个参数的意思:

create user ctxsys
identified by &pass default tablespace &tbs temporary tablespace &ttbs;

begin
  if ('&dolock' = 'LOCK') then
    execute immediate
      'alter user ctxsys password expire account lock';
  end if;
end;
/

    原来,&pass是CTXSYS user的密码,&tbs是CTXSYS user的default tablespace,&ttbs是CTXSYS user的temporary tablespace;而&dolock只要不为'LOCK',那么CTXSYS user就不会被锁住。

    于是,执行如下命令安装TEXT相关user,role,objects...

SQL> @?/ctx/admin/catctx.sql mypwd DATA TEMP NOLOCK

    接着我们按照文档创建一个简单的测试:

CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));
INSERT INTO docs VALUES(1, 'California is a state in the US.');
INSERT INTO docs VALUES(2, 'Paris is a city in France.');
INSERT INTO docs VALUES(3, 'France is in Europe.');

   然后创建TEXT index:

SQL> CREATE INDEX idx_docs ON docs(text)
  2    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
  3    ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
CREATE INDEX idx_docs ON docs(text)
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10700: preference does not exist: CTXSYS.DEFAULT_LEXER
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366

    我们发现在创建index的时候出错了,原因是我们并没有执行这个脚本:$ORACLE_HOME/ctx/admin/defaults/drdefus.sql

于是执行之:(注意,这个脚本需要用CTXSYS用户执行)
SQL> conn CTXSYS/mypwd

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

    在使用SYS赋权之后,再尝试创建index:

SQL> CREATE INDEX idx_docs ON docs(text)
  2    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
  3    ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
CREATE INDEX idx_docs ON docs(text)
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object

    发现,虽然我们前面创建TEXT index出错,但是实际还是创建出来了一个index,只是他的user_indexes.DOMIDX_OPSTATUS='FAILED'。

SQL> l
  1  select INDEX_TYPE,STATUS,DOMIDX_STATUS,DOMIDX_OPSTATUS
  2* from user_indexes where INDEX_NAME='IDX_DOCS'
SQL> /

INDEX_TYPE STATUS  DOMIDX_STATUS                        DOMIDX_OPSTATUS
---------- ------- ------------------------------------ ------------------
DOMAIN     VALID   VALID                                FAILED

    而且这个TEXT index是无法被使用的:
SQL> SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;
SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0
*
ERROR at line 1:
ORA-20000: Oracle Text error:
DRG-10599: column is not indexed

    所以我们只得drop重建。

SQL> drop index IDX_DOCS;

Index dropped.

SQL> CREATE INDEX idx_docs ON docs(text)
  2    INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
  3    ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');

Index created.

SQL> SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;

  SCORE(1)         ID TEXT
---------- ---------- ------------------------------------------------------------
         4          2 Paris is a city in France.
         4          3 France is in Europe.
   

    最后按照文档,我们需要grant如下权限给当前测试用户。

GRANT RESOURCE, CONNECT, CTXAPP TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_CLS TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DOC TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_THES TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO TEXT_USER;

    综上,在11G,手工创建ORACLE TEXT只需要如下三步:

1.

login as SYS:

@?/ctx/admin/catctx.sql mypwd DATA TEMP NOLOCK

2.

login as CATSYS user,run:
conn CTXSYS/mypwd

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

3.

create user TEXT_USER identified by TEXT_USER;
GRANT RESOURCE, CONNECT, CTXAPP TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_CLS TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_DOC TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_THES TO TEXT_USER;
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO TEXT_USER;

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15415488/viewspace-622482/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15415488/viewspace-622482/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值