Oracle的全文索引除了支持文字匹配查询,还支持对文章涵义的查询。这是通过ABOUT操作实现的。
Oracle默认情况下支持英文和法文的文章涵义支持。其他语言可以添加通过用户自定义的语言库来实现相应的功能。
在 这之前需要先安装Companion CD 的Oracle Database 10g Products Installation Type,其中包括了Oracle Text Supplied Knowledge Bases,否则在建立含有about的索引时会出错。Companion CD可直接在官网下载,安装也非常简单。
下面看看英文环境下简单的ABOUT操作用法:
SQL> conn myuser/myuser
Connected.
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, DOCS VARCHAR2(1000));
Table created.
SQL> INSERT INTO T VALUES (1, 'You can augment the knowledge base to define concepts and terms specific to your
industry or query application. When you do so, ABOUT queries are more precise for the added concepts.');
1 row created.
SQL> INSERT INTO T VALUES (2, 'ABOUT queries perform best when you create a theme component in your index. Theme
components are created by default for English and French.');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT;
Index created.
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(queries)') > 0;
ID
----------
1
2
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'queries') > 0;
ID
----------
1
2
默认的LEXER是BASIC_LEXER,因此,可以ABOUT操作已经可以起作用了,但是由于采用默认设置,ABOUT查询的精度不高。虽然可以查询到,但是这个单词本身就是在文章中出现的,如果使用文章中没有出现的单词,ABOUT还是查询不到。
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(definition)') > 0;
no rows selected
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'definition') > 0;
no rows selected
如果希望提高ABOUT操作的查询精度,可以设置BASIC_LEXER中的INDEX_THEMES属性的值为YES。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_ABOUT', 'BASIC_LEXER');
3 CTX_DDL.SET_ATTRIBUTE('TEST_ABOUT', 'INDEX_THEMES', 'YES');
4 CTX_DDL.SET_ATTRIBUTE('TEST_ABOUT', 'INDEX_TEXT', 'YES');
5 END;
6 /
SQL> DROP INDEX IND_T_DOCS;
Index dropped.
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER TEST_ABOUT');
Index created.
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(definition)') > 0;
ID
----------
1
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'specifics') > 0;
no rows selected
现在已经可以看出差别来了,文章中并没有包含definition单词,但是Oracle自动生成了关于definition的主题。
下面再插入一些测试资料,试试主题搜索的使用
SQL> Insert into MYUSER.T (ID, DOCS)
2 Values (3, 'Los Angeles is a city of american');
1 row created.
SQL> Insert into MYUSER.T (ID, DOCS)
2 Values (4, 'Los Angeles');
1 row created.
SQL> Insert into MYUSER.T (ID, DOCS)
2 Values (5, 'San Francisco is a city of american too');
1 row created.
SQL> Insert into MYUSER.T (ID, DOCS)
2 Values (6, 'ABOUT queries perform best when you create a theme component in your index.San Francisco is a
city of american too');
1 row created.
SQL> Insert into MYUSER.T (ID, DOCS)
2 Values (7, 'is Los Angeles');
1 row created.
SQL> commit;
Commit complete.
SQL> exec ctx_ddl.sync_index('IND_T_DOCS');
PL/SQL procedure successfully completed.
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(California)') > 0;
ID
---
3
5
6
由于Los Angeles和San Francisco是所属California洲,所以当查California时,Los Angeles和San Francisco的资料被查出来,但为何第4和第7笔数据不符合条件?可能是因为这些资料没有意义。
顺便再简单说一下STOPTHEME,和STOPWORD类似,Oracle提供了停用主题STOPTHEME,可以人为的屏蔽不希望被ABOUT操作查询到的主题。
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(definition)') > 0;
ID
---
1
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(specifics)') > 0;
ID
---
1
SQL> drop index IND_T_DOCS;
Index dropped.
SQL> BEGIN
2 CTX_DDL.CREATE_STOPLIST('TEST_BASIC', 'BASIC_STOPLIST');
3 CTX_DDL.ADD_STOPTHEME('TEST_BASIC','DEFINITION');
4 END;
5 /
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER TEST_ABOUT STOPLIST TEST_BASIC');
Index created.
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(definition)') > 0;
no rows selected
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'ABOUT(specifics)') > 0;
ID
---
1
上面的例子中,将DEFINITION添加到了TEST_BASIC停用表中,重建索引后,停用主题开始生效。
oracle全文索引之About_INDEX_THEMES操作
最新推荐文章于 2024-09-17 09:10:20 发布