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. 最佳实践

  1. CONTEXT 文本:通用
  2. CTXCAT 目录:电商
  3. 中文 Lexer:中文
  4. ON COMMIT 同步:实时
  5. 定时 SYNC:批量
  6. OPTIMIZE:定期
  7. Section:精确
  8. 同义词:智能
  9. 并行:性能
  10. 文档化:使用

16. 参考资料

[1] Oracle Text Application Developer’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ccapp/