oracle全文索引之SECTION GROUP_5_AUTO_SECTION_GROUP

jolly10發表於2009-05-25

這篇文章介紹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 --&gt
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章