Oracle 全文检索详解
Oracle 全文检索详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle Text 提供全文检索[1]:
类型:
- CONTEXT
- CTXCAT
- CTXRULE
- CTXXPATH
详细见:Oracle 全文检索。
2. CONTEXT 索引
2.1 创建
CREATE INDEX idx_docs_content ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT;
2.2 查询
SELECT * FROM docs WHERE CONTAINS(content, 'oracle', 1) > 0;
SELECT * FROM docs WHERE CONTAINS(content, 'oracle AND database') > 0;
SELECT * FROM docs WHERE CONTAINS(content, 'oracle NEAR database') > 0;
2.3 分数
SELECT id, SCORE(1) AS score
FROM docs
WHERE CONTAINS(content, 'oracle', 1) > 0
ORDER BY score DESC;
3. CTXCAT 索引
3.1 创建
BEGIN
CTX_DDL.CREATE_INDEX_SET('item_iset');
CTX_DDL.ADD_INDEX('item_iset', 'price');
END;
/
CREATE INDEX idx_items_cat ON items(name, description)
INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('INDEX SET item_iset');
3.2 查询
SELECT * FROM items
WHERE CATSEARCH(name, 'phone', 'price < 1000') > 0;
4. 中文支持
4.1 Lexer
BEGIN
CTX_DDL.CREATE_PREFERENCE('my_lexer', 'CHINESE_LEXER');
END;
/
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('LEXER my_lexer');
4.2 分词
- CHINESE_LEXER:默认
- CHINESE_VGRAM_LEXER:双字
- AUTO_LEXER:智能
5. 查询语法
5.1 基本
-- 单词
CONTAINS(col, 'oracle') > 0
-- AND
CONTAINS(col, 'oracle AND database') > 0
CONTAINS(col, 'oracle & database') > 0
-- OR
CONTAINS(col, 'oracle OR database') > 0
CONTAINS(col, 'oracle | database') > 0
-- NOT
CONTAINS(col, 'oracle NOT database') > 0
CONTAINS(col, 'oracle - database') > 0
5.2 模糊
-- 通配符
CONTAINS(col, 'ora%') > 0 -- 前缀
CONTAINS(col, '%cle') > 0 -- 后缀
-- 模糊
CONTAINS(col, '?oracle') > 0 -- 模糊匹配
-- 同义词
CONTAINS(col, 'SYN(database)') > 0
5.3 NEAR
CONTAINS(col, 'NEAR((oracle, database), 10)') > 0
-- 10 词内
5.4 短语
CONTAINS(col, '"oracle database"') > 0
6. 同义词
6.1 创建词库
BEGIN
CTX_DDL.CREATE_THESAURUS('my_thes');
CTX_DDL.CREATE_RELATION('my_thes', 'database', 'SYN', 'db');
CTX_DDL.CREATE_RELATION('my_thes', 'database', 'SYN', 'data store');
END;
/
6.2 使用
CONTAINS(col, 'SYN(database, my_thes)') > 0
7. 索引同步
7.1 手动
EXEC CTX_DDL.SYNC_INDEX('idx_docs');
7.2 自动
-- ON COMMIT
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('SYNC (ON COMMIT)');
-- 定时
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('SYNC (EVERY "SYSDATE+1/24")');
7.3 作业
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'sync_text_idx',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN CTX_DDL.SYNC_INDEX(''idx_docs''); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=HOURLY',
enabled => TRUE
);
END;
/
8. 索引优化
8.1 优化
EXEC CTX_DDL.OPTIMIZE_INDEX('idx_docs', 'FAST');
EXEC CTX_DDL.OPTIMIZE_INDEX('idx_docs', 'FULL');
EXEC CTX_DDL.OPTIMIZE_INDEX('idx_docs', 'TOKEN', 'oracle');
8.2 重建
ALTER INDEX idx_docs REBUILD;
9. Section 搜索
9.1 字段
BEGIN
CTX_DDL.CREATE_SECTION_GROUP('my_sec', 'AUTO_SECTION_GROUP');
CTX_DDL.ADD_FIELD_SECTION('my_sec', 'title', 'title', TRUE);
END;
/
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('SECTION GROUP my_sec');
-- 查询
SELECT * FROM docs WHERE CONTAINS(content, 'oracle WITHIN title') > 0;
9.2 HTML/XML
BEGIN
CTX_DDL.CREATE_SECTION_GROUP('html_sec', 'HTML_SECTION_GROUP');
CTX_DDL.ADD_TAG_SECTION('html_sec', 'title', 'title');
END;
/
10. 过滤
10.1 文件
-- BLOB
CREATE TABLE docs (id NUMBER, content BLOB);
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('FILTER CTXSYS.AUTO_FILTER');
11. 存储
11.1 STORAGE
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('STORAGE CTXSYS.DEFAULT_STORAGE');
11.2 内存
ALTER SYSTEM SET memory_target = 4G;
12. 查看
12.1 索引信息
SELECT idx_name, idx_type, idx_status
FROM ctx_user_indexes;
12.2 错误
SELECT * FROM ctx_user_index_errors;
12.3 词
SELECT token_text, token_count FROM dr$idx_docs$i
WHERE token_text LIKE 'ora%';
13. 性能
13.1 内存
- 分配大内存
- 减少磁盘 I/O
13.2 并行
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('PARALLEL 4');
13.3 分区
CREATE INDEX idx_docs ON docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
LOCAL;
14. 常见坑与排错
14.1 索引不同步
- ON COMMIT
- 定时 SYNC
14.2 中文分词
- CHINESE_LEXER
- 测试
14.3 索引膨胀
- OPTIMIZE
- REBUILD
15. 最佳实践
- CONTEXT 文本:通用
- CTXCAT 目录:电商
- 中文 Lexer:中文
- ON COMMIT 同步:实时
- 定时 SYNC:批量
- OPTIMIZE:定期
- Section:精确
- 同义词:智能
- 并行:性能
- 文档化:使用
16. 参考资料
[1] Oracle Text Application Developer’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ccapp/