【DB笔试面试555】在Oracle中,全文索引的作用是什么?
- 2019 年 10 月 10 日
- 筆記
♣
题目部分
在Oracle中,全文索引的作用是什么?
♣
答案部分
Oracle全文索引使Oracle具备了强大的文本检索能力和智能化的文本管理能力。Oracle将全文检索功能做为内置功能提供给用户,使得用户在创建数据库实例时自动安装全文检索。
要使用Oracle全文索引,必须具有CTXAPP角色或者是CTXSYS用户。Oracle全文索引为系统管理员提供CTXSYS用户,为应用程序开发人员提供CTXAPP角色。具有CTXAPP角色的用户可以使用全文索引。全文索引适合于在一些大字段类型中查找匹配关键字,例如搜索引擎(谷歌、百度)常会用到。
下面给出一个使用全文索引的示例:
首先给LHR用户赋予CTAXPP角色:
LHR@orclasm > GRANT CTXAPP TO LHR; Grant succeeded. LHR@orclasm > SELECT * FROM USER_ROLE_PRIVS D WHERE D.GRANTED_ROLE='CTXAPP'; USERNAME GRANTED_ROLE ADM DEF OS_ ------------------------------ ------------------------------ --- --- --- LHR CTXAPP NO YES NO
设置词法分析器:
EXEC CTX_DDL.DROP_PREFERENCE('enlexerlhr'); EXEC CTX_DDL.CREATE_PREFERENCE('enlexerlhr','basic_lexer');
常用的词法分析器有3种,①basic_lexer是英文词法;②chiese_vgram_lexer是专门的汉语分析器,支持所有汉字字符集,包括GB231280、ZHS16GBK、UTF8等;③chinese_lexer是一个新的汉语分析器,只支持UTF8字符集。
创建表并创建全文索引:
CREATE TABLE XT_DOCS_LHR (ID NUMBER PRIMARY KEY, TEXT VARCHAR2(80)); INSERT INTO XT_DOCS_LHR VALUES (1,'the first doc'); INSERT INTO XT_DOCS_LHR VALUES (2,'the second doc'); INSERT INTO XT_DOCS_LHR VALUES (3,'the third doc'); COMMIT;
创建索引,指定INDEXTYPE为CTXSYS.CONTEXT:
LHR@orclasm > CREATE INDEX DOC_INDEX_LHR ON XT_DOCS_LHR(TEXT) INDEXTYPE IS CTXSYS.CONTEXT; Index created. LHR@orclasm > SELECT * FROM XT_DOCS_LHR WHERE CONTAINS(TEXT, 'first') > 0; ID TEXT ---------- ----------------------- 1 the first doc Execution Plan ---------------------------------------------------------- Plan hash value: 4244292504 --------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 67 | 4 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| XT_DOCS_LHR | 1 | 67 | 4 (0)| 00:00:01 | |* 2 | DOMAIN INDEX | DOC_INDEX_LHR | | | 4 (0)| 00:00:01 | --------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("CTXSYS"."CONTAINS"("TEXT",'first')>0) Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 137 recursive calls 0 db block gets 386 consistent gets 0 physical reads 0 redo size 604 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed LHR@orclasm > SELECT D.INDEX_NAME, D.INDEX_TYPE, D.ITYP_OWNER, D.ITYP_NAME,D.DOMIDX_STATUS 2 FROM DBA_INDEXES D 3 WHERE D.INDEX_NAME LIKE 'DOC_INDEX_LHR%'; INDEX_NAME INDEX_TYPE ITYP_OWNER ITYP_NAME DOMIDX_STATU ----------------- ------------- ------------- ------------ ------------ DOC_INDEX_LHR DOMAIN CTXSYS CONTEXT VALID
可以看到查询中使用到了全文索引。当然,Oracle的全文索引远比这个例子复杂,想深入学习Oracle全文索引的读者可以参考Oracle官方文档。
& 说明:
有关全文索引的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2139034/
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。