首批通过分布式安全可靠测评,为关键业务系统打造
全文查询
更新时间:2026-07-16 19:52:04
全文查询是指在文本数据中进行全文搜索或检索的操作。全文查询能够更全面地搜索整个文本,并返回与搜索条件匹配的结果。
说明
对于 OceanBase 数据库 V4.4.2 版本,Oracle 模式从 V4.4.2 BP2 版本开始支持创建全文索引。
语法
使用以下语句进行全文索引查询,指定全文索引列,查找与 search_query 的匹配程度,返回结果为非负数的 DOUBLE,表示该行与 search_query 的相关程度,0 表示没有相关性。
CONTAINS(indexed_column, 'search_query' [, score_label])
SCORE(score_label)
参数说明:
indexed_column:表示全文索引的列名。search_query:VARCHAR2类型或CLOB类型,表示需要搜索的关键字或短语。支持搜索操作符如下:空格:表示连续短语匹配,按顺序匹配紧邻出现的词。例如'word1 word2'。支持使用双引号""或大括号{}的转义,例如搜索连续短语 "law and order",直接写'law and order'会被解析为law AND order(逻辑与),解决方法:- 使用大括号:
'{law and order}'。 - 使用双引号:
'"law and order"'。
- 使用大括号:
说明
如果
search_query参数的查询内容在对应分词器下产生的分词数量过多,可能会导致系统资源消耗增加、响应变慢,甚至影响查询性能。建议保持查询简洁、合理,以获得最佳执行效率。score_label:可选参数,NUMBER类型,表示返回结果的匹配编号。SCORE():可选参数,NUMBER类型,与score_label结合使用,score_label必须是为CONTAINS指定的score_label,NUMBER类型,用来输出CONTAINS的匹配得分(越接近相关性越高)。
使用限制及注意事项
indexed_column不存在时,会报错。indexed_column未创建全文索引时,会报错。search_query为NULL时,会报错。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, NULL, 1) > 0;。search_query为空字符串时,返回空。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, '', 1) > 0;。search_query为全空格时,返回空。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, ' ', 1) > 0;。score_label为负数时,会报错。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', -1) > 0;。SCORE标签未定义时,会报错。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1) > 0 ORDER BY SCORE(999);。SCORE出现在无CONTAINS上下文时,会报错。例如SELECT SCORE(1) FROM tbl1;。- 不支持在
GROUP BY、HAVING子句中使用SCORE。 CONTAINS未比较时,会报错。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1);。CONTAINS使用小于、等于或小于等于的比较时,会报错。例如SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1) <= 0;。- 带全文 filter 的连表查询/表重命名会报错时,会报错。例如
SELECT SCORE(1) FROM tbl2 t1 WHERE CONTAINS(t1.col2, 'OceanBase', 1) >0;。
示例
创建表
tbl1。obclient> CREATE TABLE tbl1( col1 INT, col2 CHAR(50), col3 VARCHAR2(500));创建全文索引
ft_idx1_tbl1。obclient> CREATE INDEX ft_idx1_tbl1 ON tbl1(col2) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER SPACE') LOCAL;创建全文索引
ft_idx2_tbl1。obclient> CREATE INDEX ft_idx2_tbl1 ON tbl1(col3) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER SPACE') LOCAL;向表
tbl1中添加测试数据。obclient> INSERT INTO tbl1 (col1, col2, col3) VALUES (1, 'Hello World', 'This is a test'), (2, 'OceanBase', 'OceanBase Database is a native, enterprise-level distributed database developed independently by the OceanBase team'), (3, 'Database Management', 'Learn about SQL and database administration'), (4, 'Full Text Searching', 'Master the art of full text searching');返回结果如下:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0使用
CONTAINS查询。obclient> SELECT * FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1) > 0;返回结果如下:
+------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ | COL1 | COL2 | COL3 | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ | 2 | OceanBase | OceanBase Database is a native, enterprise-level distributed database developed independently by the OceanBase team | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ 1 row in set使用
CONTAINS查询,并根据SCORE排序。obclient> SELECT col1, col2, col3, SCORE(1) FROM tbl1 WHERE CONTAINS(col2, 'Database', 1) > 0 AND col1 >= 2 ORDER BY SCORE(1) DESC;返回结果如下:
+------+----------------------------------------------------+---------------------------------------------+------------------------+ | COL1 | COL2 | COL3 | SCORE(1) | +------+----------------------------------------------------+---------------------------------------------+------------------------+ | 3 | Database Management | Learn about SQL and database administration | 1.259496819494492E+000 | +------+----------------------------------------------------+---------------------------------------------+------------------------+ 1 row in set多个查询,并使用
score_label结合SCORE输出结果。obclient> SELECT col1, col2, col3, SCORE(10), SCORE(20) FROM tbl1 WHERE CONTAINS (col2, 'Database', 10) > 0 OR CONTAINS (col3, 'OceanBase', 20) > 0 ORDER BY SCORE(10), SCORE(20);返回结果如下:
+------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+------------------------+-------------------------+ | COL1 | COL2 | COL3 | SCORE(10) | SCORE(20) | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+------------------------+-------------------------+ | 2 | OceanBase | OceanBase Database is a native, enterprise-level distributed database developed independently by the OceanBase team | 0 | 1.1331643117640413E+000 | | 3 | Database Management | Learn about SQL and database administration | 1.259496819494492E+000 | 0 | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+------------------------+-------------------------+ 2 rows in set