CREATE CATALOG es PROPERTIES ("type"="es","hosts"="http://127.0.0.1:9200");
default_db
。并且在通过 SWITCH 命令切换到 ES Catalog 后,会自动切换到 default_db
。无需再执行 USE default_db
命令。参数 | 是否必须 | 默认值 | 说明 |
hosts | 是 | - | ES 地址,可以是一个或多个,也可以是 ES 的负载均衡地址 |
user | 否 | 空 | ES 用户名 |
password | 否 | 空 | 对应用户的密码信息 |
doc_value_scan | 否 | true | 是否开启通过 ES/Lucene 列式存储获取查询字段的值 |
keyword_sniff | 否 | true | 是否对 ES 中字符串分词类型 text.fields 进行探测,通过 keyword 进行查询。设置为 false 会按照分词后的内容匹配 |
nodes_discovery | 否 | true | 是否开启 ES 节点发现,默认为 true,在网络隔离环境下设置为 false,只连接指定节点 |
ssl | 否 | false | ES 是否开启 https 访问模式,目前在 fe/be 实现方式为信任所有 |
mapping_es_id | 否 | false | 是否映射 ES 索引中的 _id 字段 |
like_push_down | 否 | true | 是否将 like 转化为 wildcard 下推到 ES,会增加 ES cpu 消耗 |
/_cluster/state/、_nodes/http
等路径和 index 的读权限; 集群未开启安全认证,用户名和密码不需要设置。ES Type | Doris Type | Comment |
null | null | - |
boolean | boolean | - |
byte | tinyint | - |
short | smallint | - |
integer | int | - |
long | bigint | - |
unsigned_long | largeint | - |
float | float | - |
half_float | float | - |
double | double | - |
scaled_float | double | - |
date | date | 仅支持 default/yyyy-MM-dd HH:mm:ss/yyyy-MM-dd/epoch_millis 格式 |
keyword | string | - |
text | string | - |
ip | string | - |
nested | string | - |
object | string | - |
other | unsupported | - |
doris
结构注释。对于 Elasticsearch 6.x 及之前版本,请参考_meta。doc
包含以下的数据结构:{"array_int_field": [1, 2, 3, 4],"array_string_field": ["doris", "is", "the", "best"],"id_field": "id-xxx-xxx","timestamp_field": "2022-11-12T12:08:56Z","array_object_field": [{"name": "xxx","age": 18}]}
_meta.doris
属性来定义。# ES 7.x and abovecurl -X PUT "localhost:9200/doc/_mapping?pretty" -H 'Content-Type:application/json' -d '{"_meta": {"doris":{"array_fields":["array_int_field","array_string_field","array_object_field"]}}}'# ES 6.x and beforecurl -X PUT "localhost:9200/doc/_mapping?pretty" -H 'Content-Type: application/json' -d '{"_doc": {"_meta": {"doris":{"array_fields":["array_int_field","array_string_field","array_object_field"]}}}}
array_fields
:用来表示数组类型的字段。SQL syntax | ES 5.x+ syntax |
= | term query |
in | terms query |
> , < , >= , ⇐ | range query |
and | bool.filter |
or | bool.should |
not | bool.must_not |
not in | bool.must_not + terms query |
is\\_not\\_null | exists query |
is\\_null | bool.must_not + exists query |
esquery | ES 原生 json 形式的 QueryDSL |
"enable_docvalue_scan" = "true"
_source
中解析获取。_source
中获取所需的所有列,_source
的存储采用的行式+json的形式存储,在批量读取性能上要劣于列式存储,尤其在只需要少数列的情况下尤为明显,只获取少数列的情况下,docvalue 的性能大约是_source
性能的十几倍。text
类型的字段在 ES 中是没有列式存储,因此如果要获取的字段值有text
类型字段会自动降级为从_source
中获取。>= 25
),从docvalue
中获取字段值的性能会和从_source
中获取字段值基本一样。"enable_keyword_sniff" = "true"
text
类型的字段又有keyword
类型的字段,这就是 ES 的 multi fields 特性,mapping 如下:"k4": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}
k4 = "Doris On ES"
"term" : {"k4": "Doris On ES"}
text
,在数据导入的时候就会根据 k4 设置的分词器(如果没有设置,就是 standard 分词器)进行分词处理得到 doris、on、es三个 Term,如下 ES analyze API 分析:POST /_analyze{"analyzer": "standard","text": "Doris On ES"}
{"tokens": [{"token": "doris","start_offset": 0,"end_offset": 5,"type": "<ALPHANUM>","position": 0},{"token": "on","start_offset": 6,"end_offset": 8,"type": "<ALPHANUM>","position": 1},{"token": "es","start_offset": 9,"end_offset": 11,"type": "<ALPHANUM>","position": 2}]}
"term" : {"k4": "Doris On ES"}
Doris On ES
这个 term 匹配不到词典中的任何 term,不会返回任何结果,而启用enable_keyword_sniff: true
会自动将k4 = "Doris On ES"
转换成k4.keyword = "Doris On ES"
来完全匹配 SQL 语义,转换后的 ES query DSL 为:"term" : {"k4.keyword": "Doris On ES"}
k4.keyword
的类型是keyword
,数据写入 ES 中是一个完整的 term,所以可以匹配。"nodes_discovery" = "true"
"ssl" = "true"
,目前 FE/BE 实现方式为信任所有,这是临时解决方案,后续会使用真实的用户配置证书。select * from es_table where k1 > 1000 and k3 ='term' or k4 like 'fu*z_'
esquery(field, QueryDSL)
函数将一些无法用 sql 表述的 query 如 match_phrase、geoshape 等下推给 ES 进行过滤处理,esquery
的第一个列名参数用于关联index
,第二个参数是 ES 的基本Query DSL
的 json 表述,使用花括号{}
包含,json 的root key
有且只能有一个,如 match_phrase
、geo_shape
、bool
等。match_phrase
查询:select * from es_table where esquery(k4, '{"match_phrase": {"k4": "doris on es"}}');
geo
相关查询:select * from es_table where esquery(k4, '{"geo_shape": {"location": {"shape": {"type": "envelope","coordinates": [[13,53],[14,52]]},"relation": "within"}}}');
bool
查询:select * from es_table where esquery(k4, ' {"bool": {"must": [{"terms": {"k1": [11,12]}},{"terms": {"k2": [100]}}]}}');
"dt": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}
date
或datetime
,也可以设置为varchar
类型, 使用如下 SQL 语句都可以直接将过滤条件下推至 ES:select * from doe where k2 > '2020-06-21';select * from doe where k2 < '2020-06-21 12:00:00';select * from doe where k2 < 1593497011;select * from doe where k2 < now();select * from doe where k2 < date_format(now(), '%Y-%m-%d');
format
,默认的时间类型字段格式为:strict_date_optional_time||epoch_millis
ms
,ES内部处理时间戳都是按照ms
进行处理的, 否则 ES 外表会出现显示错误。_id
_id
的情况下,ES 会给每个文档分配一个全局唯一的 _id
即主键, 用户也可以在导入时为文档指定一个含有特殊业务意义的 _id
;varchar
的_id
字段:CREATE EXTERNAL TABLE `doe` (`_id` varchar COMMENT "",`city` varchar COMMENT "") ENGINE=ELASTICSEARCHPROPERTIES ("hosts" = "http://127.0.0.1:8200","user" = "root","password" = "root","index" = "doe"}
"mapping_es_id" = "true"
。_id
字段的过滤条件仅支持=
和in
两种。_id
字段必须为 varchar
类型。+----------------------------------------------+| || Doris +------------------+ || | FE +--------------+-------+| | | Request Shard Location| +--+-------------+-+ | || ^ ^ | || | | | || +-------------------+ +------------------+ | || | | | | | | | || | +----------+----+ | | +--+-----------+ | | || | | BE | | | | BE | | | || | +---------------+ | | +--------------+ | | |+----------------------------------------------+ || | | | | | || | | | | | || HTTP SCROLL | | HTTP SCROLL | |+-----------+---------------------+------------+ || | v | | v | | || | +------+--------+ | | +------+-------+ | | || | | | | | | | | | || | | DataNode | | | | DataNode +<-----------+| | | | | | | | | | || | | +<--------------------------------+| | +---------------+ | | |--------------| | | || +-------------------+ +------------------+ | || Same Physical Node | || | || +-----------------------+ | || | | | || | MasterNode +<-----------------+| ES | | || +-----------------------+ |+----------------------------------------------+
HTTP Scroll
方式流式的从 ES index 的每个分片中并发的从_source
或docvalue
中获取数据。
本页内容是否解决了您的问题?