通过搜索优化加速文本查询¶
搜索优化可以提高使用 SEARCH 和 SEARCH_IP 函数的查询的性能。这些查询搜索一个或多个表的指定列中的字符数据(文本)和 IPv4 地址,包括 VARIANT、OBJECT、和 ARRAY 列中的元素。
备注
必须使用 ON 子句为特定列启用此功能,该子句位于 ALTER TABLE ...ADD SEARCH OPTIMIZATION 命令中。例如:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
如果省略 ON 子句,则不会优化文本搜索。
以下部分提供了更多详细信息:
FULL_TEXT 搜索优化的运行时使用条件¶
在使用 SEARCH 函数查询的表上启用 FULL_TEXT 搜索优化后,可以在查询规划和执行期间使用优化的搜索访问路径。必须满足以下条件:
搜索优化必须准备就绪,可供使用(在 DESCRIBE SEARCH OPTIMIZATION 输出中,
active
列 = TRUE)。必须在 SEARCH 谓词中指定的列的超集上启用搜索优化。例如,如果表包含 VARCHAR 列
c1,c2,c3,c4,c5
,则搜索优化涵盖列c1,c2,c3
,并且该函数搜索其中一列、两列或三列(但不搜索c4
或c5
),则查询可以从 FULL_TEXT 搜索优化中受益。在 ALTER TABLE 命令中为搜索优化定义的分析器必须与 SEARCH 函数调用中指定的分析器相同。
小技巧
要了解某个查询是否使用了特定的搜索访问路径,请在该查询配置文件中查找 Search Optimization Access
节点。
ADD(和 DROP)FULL_TEXT 搜索优化的示例¶
以下示例展示了如何对表中的列启用 FULL_TEXT 搜索优化,以便在使用 SEARCH 函数查询这些列时提高查询性能。
使用特定分析器启用 FULL_TEXT 搜索优化¶
以下示例对一列启用 FULL_TEXT 搜索优化并指定了分析器。优化类型和分析器 (method
) 的组合反映在 DESCRIBE 输出中。
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(line, ANALYZER => 'UNICODE_ANALYZER');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+--------+------------------+--------+
如果使用默认分析器对同一列启用 FULL_TEXT 搜索优化,则 DESCRIBE 输出将返回两行并按表达式 ID 和方法区分这两个条目。
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(line);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | false |
+---------------+----------------------------+--------+------------------+--------+
对 VARIANT 列启用 FULL_TEXT 搜索优化¶
以下命令对 VARIANT 列启用 FULL_TEXT 搜索优化。(此 car_sales
表及其数据如 查询半结构化数据 下所述。)
ALTER TABLE car_sales ADD SEARCH OPTIMIZATION
ON FULL_TEXT(src);
DESCRIBE SEARCH OPTIMIZATION ON car_sales;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | SRC | VARIANT | true |
+---------------+----------------------------+--------+------------------+--------+
对 OBJECT 列启用 FULL_TEXT 搜索优化¶
以下示例对 OBJECT 列启用 FULL_TEXT 搜索优化。
首先,创建一个包含 OBJECT 列的表并插入数据:
CREATE OR REPLACE TABLE so_object_example (object_column OBJECT);
INSERT INTO so_object_example (object_column)
SELECT OBJECT_CONSTRUCT('a', 1::VARIANT, 'b', 2::VARIANT);
通过以下命令可对 OBJECT 列启用 FULL_TEXT 搜索优化。
ALTER TABLE so_object_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(object_column);
DESCRIBE SEARCH OPTIMIZATION ON so_object_example;
+---------------+----------------------------+---------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+---------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | OBJECT_COLUMN | OBJECT | true |
+---------------+----------------------------+---------------+------------------+--------+
对 ARRAY 列启用 FULL_TEXT 搜索优化¶
以下示例对 ARRAY 列启用 FULL_TEXT 搜索优化。
首先,创建一个包含 ARRAY 列的表并插入数据:
CREATE OR REPLACE TABLE so_array_example (array_column ARRAY);
INSERT INTO so_array_example (array_column)
SELECT ARRAY_CONSTRUCT('a', 'b', 'c');
通过以下命令可对 ARRAY 列启用 FULL_TEXT 搜索优化。
ALTER TABLE so_array_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(array_column);
DESCRIBE SEARCH OPTIMIZATION ON so_array_example;
+---------------+----------------------------+--------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | ARRAY_COLUMN | ARRAY | true |
+---------------+----------------------------+--------------+------------------+--------+
从一列或多列中删除 FULL_TEXT 优化¶
您可以对多列启用 FULL_TEXT 优化,然后从其中一列或多列中删除优化。其余列仍处于优化状态。
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, act_scene_line, character, line, ANALYZER => 'UNICODE_ANALYZER');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT UNICODE_ANALYZER | ACT_SCENE_LINE | VARCHAR(10) | true |
| 3 | FULL_TEXT UNICODE_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 4 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+----------------+------------------+--------+
ALTER TABLE lines DROP SEARCH OPTIMIZATION ON 1, 2, 3;
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 4 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+--------+------------------+--------+
使用通配符 (*) 对所有符合条件的列启用搜索优化¶
以下 ALTER TABLE 命令对 lines
表中的所有四个 VARCHAR 列启用 FULL_TEXT 搜索优化:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(*);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | ACT_SCENE_LINE | VARCHAR(10) | true |
| 3 | FULL_TEXT DEFAULT_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 4 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+----------------+------------------+--------+
启用 FULL_TEXT 优化时出现的预期错误¶
以下 ALTER TABLE 命令因预期错误而失败,因为指定的列之一是 NUMBER 列:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, speech_num, act_scene_line, character, line);
001128 (42601): SQL compilation error: error line 1 at position 76
Expression FULL_TEXT(IDX_SRC_TABLE.SPEECH_NUM) cannot be used in search optimization.