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)授权角色。为该用户授权 RESOURCE、CONNECT 和 CTXAPP 角色:
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: