2012年8月23日星期四

Oracle 11g Release 1 (11.1) Oracle Text 如何创建 CTXCAT 索引

Oracle 11g Release 1 (11.1) Oracle Text 如何创建 CTXCAT 索引

本文内容

  • 创建一个 Oracle 全文检索用户
  • 创建表和插入数据
  • 创建 CTXCAT 索引

 

创建一个 Oracle 全文检索用户并授权


在使用 Oracle 全文检索的索引和其 PL/SQL 包之前,需要创建一个带 CTXAPP 角色的用户。该角色使你可以做如下事情:

  • 创建和删除 Oracle 全文检索的索引引用
  • 使用 Oracle 全文检索 PL/SQL 包

若进行全文检索,以数据库管理员身份登录,按下面步骤:

1)创建用户。建一个用户名/密码为 MYUSER / myuser_password 的用户:

CREATE USER myuser IDENTIFIED BY myuser_password;

2)授权角色。为该用户授权 RESOURCECONNECTCTXAPP 角色:

GRANT RESOURCE, CONNECT, CTXAPP TO MYUSER;

3)授权执行 CTX PL/SQL 包的权限

Oracle 全文检索包含很多包,可以让你完成从同步 Oracle 全文检索索引到高亮显示文本的所有动作。例如,CTX_DDL 包包含了 SYNC_INDEX 过程,该存储过程可以同步全文检索的索引。

若想调用这些存储过程,你的应用程序需要有执行这些包的权限。例如,为 MYUSER 用户授权执行所有 Oracle 全文的包的权限,如下代码:

GRANT EXECUTE ON CTXSYS.CTX_CLS TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_DOC TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_THES TO myuser;
 
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO myuser;

 

创建表并插入数据


本节演示为一个拍卖站点创建目录索引,该站点销售如摄像机和 CD 播放器等电子设备。新的条目每天都会增加,包括条目描述、拍卖日期和价格。

应用程序查询需要良好的响应时间。关键是确定用户频繁检索哪个列,以创建合适的 CTXCAT 索引。该类型索引的查询需要 CATSEARCH 操作符。

假设,数据库有个 myuser 用户。

1)用 myuser 用户连接数据库

SQL> CONNECT myuser;

2)创建 auction

SQL> CREATE TABLE auction(
  2  item_id NUMBER,
  3  title VARCHAR2(100),
  4  category_id NUMBER,
  5  price NUMBER,
  6  bid_close DATE);
 
Table created
 
SQL> 

3)向该表插入 4 条数据

SQL> INSERT INTO AUCTION
  2  VALUES
  3    (1, 'NIKON CAMERA', 1, 400, to_date('2012-8-1', 'yyyy-mm-dd'));
 
1 row inserted
SQL> INSERT INTO AUCTION
  2  VALUES
  3    (2, 'OLYMPUS CAMERA', 1, 300, to_date('2012-8-5', 'yyyy-mm-dd'));
 
1 row inserted
SQL> INSERT INTO AUCTION
  2  VALUES
  3    (3, 'PENTAX CAMERA', 1, 200, to_date('2012-8-10', 'yyyy-mm-dd'));
 
1 row inserted
SQL> INSERT INTO AUCTION
  2  VALUES
  3    (4, 'CANON CAMERA', 1, 250, to_date('2012-8-20', 'yyyy-mm-dd'));
 
1 row inserted
 
SQL> 

创建 CTXCAT 索引

1)确定查询。确定可能检索的标准是什么。本节所有的查询使用 title 列,并按 price 排序。当使用 CATSEARCH 操作符后,我们将为 title 列指定条目,并为结构化子句指定标准。

2)创建一个子索引以便按 price 字段排序

为了使 Oracle 全文检索更有效地执行查询,我们需要一个 price 列的子索引。因为,查询将按 price 排序。

因此,创建一个名为 "auction_iset" 索引集,并添加一个 price 列子索引。

SQL> EXEC CTX_DDL.create_index_set('auction_iset')
 
PL/SQL procedure successfully completed
 
SQL> EXEC CTX_DDL.add_index('auction_iset','price')
 
PL/SQL procedure successfully completed
 
SQL>

3)在 auction 表的 title 列上创建 CTXCAT 索引

SQL> CREATE INDEX auction_titlex ON AUCTION(title) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set auction_iset');
 
Index created
 
SQL> 

图 1 拍卖表的模式(表结构)和 CTXCAT 索引

4)用 CATSEARCH  查询。需要使用 CATSEARCH 操作查询 CTXCAT 索引。

SQL> SELECT title, price
  2    FROM auction;
 
TITLE                     PRICE
-------------------- ----------
NIKON CAMERA                400
OLYMPUS CAMERA              300
PENTAX CAMERA               200
CANON CAMERA                250
 
SQL> 
SQL> SELECT title, price
  2    FROM auction
  3   WHERE CATSEARCH(title, 'CAMERA', 'order by price') > 0;
 
TITLE                     PRICE
-------------------- ----------
PENTAX CAMERA               200
CANON CAMERA                250
OLYMPUS CAMERA              300
NIKON CAMERA                400
 
SQL> 

5)插入新数据后,再查询。

SQL> INSERT INTO AUCTION
  2  VALUES
  3    (5, 'FUJI CAMERA', 1, 350, to_date('2012-9-10', 'yyyy-mm-dd'));
 
1 row inserted
SQL> INSERT INTO AUCTION
  2  VALUES
  3    (6, 'SONY CAMERA', 1, 310, to_date('2012-9-22', 'yyyy-mm-dd'));
 
1 row inserted
SQL> SELECT title, price
  2    FROM auction
  3   WHERE CATSEARCH(title, 'CAMERA', 'order by price') > 0;
 
TITLE                     PRICE
-------------------- ----------
PENTAX CAMERA               200
CANON CAMERA                250
OLYMPUS CAMERA              300
SONY CAMERA                 310
FUJI CAMERA                 350
NIKON CAMERA                400
 
6 rows selected
 
SQL> 

注意:新添加的数据是如何立即在查询中显示出来的。

 

参考资料

  • CTX_DDL Package http://docs.oracle.com/cd/B28359_01/text.111/b28304/cddlpkg.htm#i996734

TAG: