这篇文章介绍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
15
16
17
19 ]]>
20
21
22
23
24
25
26
27
28
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博客 ” ,链接:https://blog.itpub.net/271283/viewspace-1022452/ ,如需转载,请注明出处,否则将追究法律责任。