通过搜索优化加速文本查询

搜索优化可以提高使用 SEARCHSEARCH_IP 函数的查询的性能。这些查询搜索一个或多个表的指定列中的字符数据(文本)和 IPv4 地址,包括 VARIANT、OBJECT、和 ARRAY 列中的元素。

备注

必须使用 ON 子句为特定列启用此功能,该子句位于 ALTER TABLE ...ADD SEARCH OPTIMIZATION 命令中。例如:

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(play, character, line);
Copy

如果省略 ON 子句,则不会优化文本搜索。

以下部分提供了更多详细信息:

FULL_TEXT 搜索优化的运行时使用条件

在使用 SEARCH 函数查询的表上启用 FULL_TEXT 搜索优化后,可以在查询规划和执行期间使用优化的搜索访问路径。必须满足以下条件:

  • 搜索优化必须准备就绪,可供使用(在 DESCRIBE SEARCH OPTIMIZATION 输出中,active 列 = TRUE)。

  • 必须在 SEARCH 谓词中指定的列的超集上启用搜索优化。例如,如果表包含 VARCHAR 列 c1,c2,c3,c4,c5,则搜索优化涵盖列 c1,c2,c3,并且该函数搜索其中一列、两列或三列(但不搜索 c4c5),则查询可以从 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');
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+--------+------------------+--------+
| 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);
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+--------+------------------+--------+
| 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;
Copy
+---------------+----------------------------+--------+------------------+--------+
| 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);
Copy

通过以下命令可对 OBJECT 列启用 FULL_TEXT 搜索优化。

ALTER TABLE so_object_example ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(object_column);

DESCRIBE SEARCH OPTIMIZATION ON so_object_example;
Copy
+---------------+----------------------------+---------------+------------------+--------+
| 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');
Copy

通过以下命令可对 ARRAY 列启用 FULL_TEXT 搜索优化。

ALTER TABLE so_array_example ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(array_column);

DESCRIBE SEARCH OPTIMIZATION ON so_array_example;
Copy
+---------------+----------------------------+--------------+------------------+--------+
| 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;
Copy
+---------------+----------------------------+----------------+------------------+--------+
| 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;
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+--------+------------------+--------+
| 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(*);
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+----------------+------------------+--------+
| 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);
Copy
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.
语言: 中文