AutoETL提供多个会话变量(Session Variable),用于在创建搜索视图(Search View)时配置高级同步行为,如JSON字段转换、搜索路由、写入模式等。本文介绍各参数的使用方法和实践案例。
参数说明
在创建搜索视图之前,您可以通过SET语句设置以下会话变量来配置同步行为。设置后,在当前会话中创建的搜索视图将使用这些配置。
参数 | 说明 |
| ETL SQL参数配置,用于控制搜索视图同步链路的运行参数。 |
| MySQL源表同步参数配置,用于控制从源表读取数据的行为。 |
| PolarSearch目标表同步参数配置,用于控制向PolarSearch索引写入数据的行为。 |
会话变量仅在当前会话中生效。设置后创建的搜索视图将持久化这些配置,即使会话关闭后,搜索视图仍按创建时的参数运行。
实践案例
JSON字段自动转换
当源表包含JSON类型字段时,AutoETL默认将JSON字段以字符串形式存储到PolarSearch中。您可以通过esl_sink_options参数配置JSON字段的转换方式。
数据准备
CREATE DATABASE IF NOT EXISTS db3; USE db3; CREATE TABLE IF NOT EXISTS t1 ( id INT PRIMARY KEY, c1 JSON ); INSERT INTO t1 VALUES (1, '{"name": "Alice", "age": 30}'); INSERT INTO t1 VALUES (2, '{"name": "Bob", "age": 25}');默认行为(字符串存储)
不设置任何参数,JSON字段将以字符串形式存储到PolarSearch中。
CREATE SEARCH VIEW view_json_default AS SELECT * FROM db3.t1;验证数据(部分数据):
{ "hits": [ { "_index": "view_json_default", "_id": "2", "_score": 1, "_source": { "id": 2, "c1": "{\"age\":25,\"name\":\"Bob\"}" } }, { "_index": "view_json_default", "_id": "1", "_score": 1, "_source": { "id": 1, "c1": "{\"age\":30,\"name\":\"Alice\"}" } } ] }Nested类型存储
通过
sink.json-flatten.fields参数指定需要转换为Nested类型的JSON字段。多个字段之间用英文分号;分隔。SET esl_sink_options = "'sink.json-flatten.fields' = 'c1'"; CREATE SEARCH VIEW view_json_nested AS SELECT * FROM db3.t1;验证数据(部分数据):
{ "hits": [ { "_index": "view_json_nested", "_id": "1", "_score": 1, "_source": { "id": 1, "c1": { "age": 30, "name": "Alice" } } }, { "_index": "view_json_nested", "_id": "2", "_score": 1, "_source": { "id": 2, "c1": { "age": 25, "name": "Bob" } } } ] }Flatten模式存储
通过
sink.json-flatten.mode参数设置为flatten,将JSON字段展平为独立的顶级字段。SET esl_sink_options = "'sink.json-flatten.fields' = 'c1', 'sink.json-flatten.mode' = 'flatten'"; CREATE SEARCH VIEW view_json_flatten AS SELECT * FROM db3.t1;验证数据(部分数据):在Flatten模式下,JSON中的
name和age字段将被展平为PolarSearch索引中的独立顶级字段。{ "hits": [ { "_index": "view_json_flatten", "_id": "2", "_score": 1, "_source": { "id": 2, "name": "Bob", "age": 25 } }, { "_index": "view_json_flatten", "_id": "1", "_score": 1, "_source": { "id": 1, "name": "Alice", "age": 30 } } ] }
搜索路由字段设置
通过routing-fields参数,可以指定PolarSearch索引的路由字段。路由字段的值将用于确定文档存储在哪个分片中,优化特定字段的查询性能。多个字段之间用英文分号;分隔。
数据准备
CREATE DATABASE IF NOT EXISTS db4;
USE db4;
CREATE TABLE IF NOT EXISTS t1 (
id INT PRIMARY KEY,
c1 VARCHAR(100),
c2 VARCHAR(100)
);
INSERT INTO t1(id, c1, c2) VALUES
(1, 'apple', 'red'),
(2, 'banana', 'yellow'),
(3, 'grape', 'purple');示例
以c1字段作为路由字段创建搜索视图:
SET esl_sink_options = "'routing-fields' = 'c1'";
CREATE SEARCH VIEW view_routing AS SELECT * FROM db4.t1;忽略删除
在多表汇聚场景中,搜索视图对PolarSearch索引的更新模式为先删除后插入。如果您不希望在查询时访问到被删除数据的中间状态,可以通过ignore-delete参数设置为true来忽略删除操作。
忽略删除可能会导致PolarSearch索引中的数据膨胀。建议在源表中使用软删除标记(如添加is_deleted字段),配合定期清理策略使用。
示例
SET esl_sink_options = "'ignore-delete' = 'true'";
CREATE SEARCH VIEW view_no_delete AS SELECT t1.id, t1.c1, t2.c2 FROM db3.t1 AS t1 JOIN db2.t2 AS t2 ON t1.id = t2.id;替换写入模式
默认情况下,搜索视图使用更新模式(Update)向PolarSearch写入数据,即仅更新变更的字段。如果您希望使用替换模式(Index),即每次写入都替换整个文档,可以通过sink.force-index-request参数设置为true。
两种模式对比
特性 | 更新模式(默认) | 替换模式 |
写入方式 | 仅更新变更的字段 | 替换整个文档 |
适用场景 | 仅同步源表部分字段时,避免未同步字段的值被清除 | 同步源表全部字段,或需要确保PolarSearch文档与源数据完全一致 |
示例
SET esl_sink_options = "'sink.force-index-request' = 'true'";
CREATE SEARCH VIEW view_replace AS SELECT * FROM db3.t1;