ITPub博客

首页 > 数据库 > Oracle > oracle全文索引之SECTION GROUP_5_AUTO_SECTION_GROUP

oracle全文索引之SECTION GROUP_5_AUTO_SECTION_GROUP

原创 Oracle 作者:jolly10 时间:2009-05-25 12:15:26 0 删除 编辑

这篇文章介绍Oracle全文索引的SECTION GROUP属性中的AUTO_SECTION_GROUP。

[@more@]Oracle的AUTO_SECTION_GROUP是XML_SECTION_GROUP的增强型。对于XML_SECTION_GROUP用户需要自己添加需要定义的节组,而使用AUTO_SECTION_GROUP,则Oracle会自动添加节组以及属性信息。

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(4000));

表已创建。

SQL> INSERT INTO T VALUES (1, '
2
3
4
5
6

7
8 <!-- Metric oracle_csa -->
9
10
11
12

13
14 emdRoot
15 scriptsDir
16 GUID
17 18 "%perlBin%/perl" "%scriptsDir%/osm/ecmCollectCSA.pl" -emdroot "%emdRoot%" -outfile "%loaderFile%" -targetguid "%targetGUID%" -indir "%recvFileDir%" -emdURL "%emdURL%"
19 ]]>
20

21

22

23
24
25
26
27
28 Receive File Directory
29

30

31

32
33

34 ');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.CREATE_SECTION_GROUP('TEST_XML', 'XML_SECTION_GROUP');
3 CTX_DDL.CREATE_SECTION_GROUP('TEST_AUTO', 'AUTO_SECTION_GROUP');
4 END;
5 /

PL/SQL 过程已成功完成。

SQL> CONN YANGTK/YANGTK@YANGTK
已连接。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('SECTION GROUP CTXSYS.TEST_XML');

索引已创建。

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'CONFIGURATION') > 0;

ID
----------
1

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'FILE WITHIN ShortName') > 0;
SELECT ID FROM T WHERE CONTAINS(DOCS, 'FILE WITHIN ShortName') > 0
*
ERROR 位于第 1 行:
ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
ORA-20000: Oracle Text error:
DRG-10837: 段 ShortName 不存在


SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'INSTANCE WITHIN Property@SCOPE') > 0;
SELECT ID FROM T WHERE CONTAINS(DOCS, 'INSTANCE WITHIN Property@SCOPE') > 0
*
ERROR 位于第 1 行:
ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
ORA-20000: Oracle Text error:
DRG-10837: 段 Property@SCOPE 不存在


SQL> DROP INDEX IND_T_DOCS;

索引已丢弃。

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('SECTION GROUP CTXSYS.TEST_AUTO');

索引已创建。

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'CONFIGURATION') > 0;

ID
----------
1

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'FILE WITHIN ShortName') > 0;

ID
----------
1

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'INSTANCE WITHIN Property@SCOPE') > 0;

ID
----------
1

通过上面的例子可以看到二者的区别,如果使用XML_SECTION_GROUP, 则用户在进行节搜索的时候,需要使用ADD_ZONE_SECTION、ADD_FIELD_SECTION或ADD_ATTR_SECTION来自己添 加感兴趣的节组,而使用AUTO_SECTION_GROUP,则Oracle会预定义好所有的节组和属性。

使用AUTO_SECTION_GROUP则不能在调用上面三种添加节组的过程,但是可以使用ADD_STOP_SECTION过程,来控制那些部分不能被节搜索访问到。

SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.ADD_STOP_SECTION('TEST_AUTO', 'ShortName');
3 END;
4 /

PL/SQL 过程已成功完成。

SQL> CONN YANGTK/YANGTK@YANGTK
已连接。
SQL> ALTER INDEX IND_T_DOCS REBUILD PARAMETERS ('REPLACE SECTION GROUP CTXSYS.TEST_AUTO');

索引已更改。

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'FILE') > 0;

ID
----------
1

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'FILE WITHIN Label') > 0;

ID
----------
1

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'FILE WITHIN ShortName') > 0;

未选定行

指定了STOP_SECTION,仅仅意味着在指定的节组中搜索不到,而在整个文档中,该节组中的内容仍然可见。

另外,需要注意,节组的标识是大小写敏感的。

如果一篇文档大部分的内容都有使用节搜索,那么使用AUTO_SECTION_GROUP属性会相当的方便,但如果一篇文档如果仅仅个别的部分需要使用节搜索,可以考虑使用XML_SECTION_GROUP,并人为的添加个别的SECTION GROUP,这样可以提高索引的创建效率。

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

请登录后发表评论 登录
全部评论

注册时间:2008-02-20

  • 博文量
    263
  • 访问量
    768951