Elasticsearch Connector
文章目录
要求与配置
对ES的版本要求:(Elasticsearch 6.6.0 or later) or OpenSearch (1.1.0 or later) 。
connector.name=elasticsearch
elasticsearch.host=190.168.1.1,190.168.1.2,190.168.1.3
elasticsearch.port=9200
elasticsearch.default-schema-name=default
常规配置
Property name | Description | Default |
---|---|---|
elasticsearch.host | 以逗号分隔的Elasticsearch节点连接的主机名称列表。这个属性是必需的。 | |
elasticsearch.port | 要连接的Elasticsearch节点的端口。 | 9200 |
elasticsearch.default-schema-name | 包含所有没有限定模式名称的定义的表的模式。 | default |
elasticsearch.scroll-size | 设置每个Elasticsearch滚动请求所能返回的最大点击数。 | 1000 |
elasticsearch.scroll-timeout | Elasticsearch为滚动请求保持搜索上下文的超时时长。 | 1m |
elasticsearch.request-timeout | 所有Elasticsearch请求的超时值。 | 10s |
elasticsearch.connect-timeout | 所有Elasticsearch连接尝试的超时值。 | 1s |
elasticsearch.backoff-init-delay | 对Elasticsearch的单个请求进行反压重试的最小时间间隔。设置得太低,可能会使ES集群负载过高。 | 500ms |
elasticsearch.backoff-max-delay | 对Elasticsearch的单个请求进行反压重试的最大时间。 | 20s |
elasticsearch.max-retry-time | 对Elasticsearch的单个请求,在所有重试中的最大持续时间。 | 20s |
elasticsearch.node-refresh-interval | 可用的Elasticsearch节点列表多久刷新一次。 | 1m |
elasticsearch.ignore-publish-address | 禁止使用Elasticsearch发布的地址来连接查询。 |
密码认证配置
要启用密码认证,需要将elasticsearch.security
选项设置为PASSWORD
。此外,还需要适当地配置以下选项:
Property name | Description |
---|---|
elasticsearch.auth.user | 用户登录名称 |
elasticsearch.auth.password | 用户密码 |
字段类型映射
Elasticsearch type | Trino type | Notes |
---|---|---|
BOOLEAN | BOOLEAN | |
DOUBLE | DOUBLE | |
FLOAT | REAL | |
BYTE | TINYINT | |
SHORT | SMALLINT | |
INTEGER | INTEGER | |
LONG | BIGINT | |
KEYWORD | VARCHAR | |
TEXT | VARCHAR | |
DATE | TIMESTAMP | Elasticsearch支持大量的日期格式,包括内置日期格式和自定义日期格式。Elasticsearch连接器只支持默认的日期类型。所有其他的日期格式,包括内置日期格式和自定义日期格式,都不被支持。带有格式属性的日期会被忽略。 |
IPADDRESS | IP |
特殊情况的处理
数组类型的处理
借助索引的元信息配置(_meta.presto
)对字段进行数组标注,通过数组函数可以进行数据的处理。
curl --request PUT \
--url localhost:9200/doc/_mapping \
--header 'content-type: application/json' \
--data '
{
"_meta": {
"trino":{
"array_string_field":{
"isArray":true
},
"object_field":{
"array_int_field":{
"isArray":true
}
},
}
}
}'
样例数据
{
"array_string_field": ["trino","the","lean","machine-ohs"],
"long_field": 314159265359,
"id_field": "564e6982-88ee-4498-aa98-df9e3f6b6109",
"timestamp_field": "1987-09-17T06:22:48.000Z",
"object_field": {
"array_int_field": [86,75,309],
"int_field": 2
}
}
原始JSON(RawJson)的处理
对于在Elasticsearch支持的类型,却在Trino中不被支持,如dense_vector。或者新的类型不断出现,这可能会导致在Elasticsearch中使用这些类型的用户出现解析异常。Trino提出来原始json的方式来解决异常。借助索引的元信息配置(_meta.presto
)对字段进行原生json标注,该字段以及下面的所有嵌套字段都需要被转换为一个包含原始JSON内容的VARCHAR
字段。通过JSON函数可以进行数据的处理。
curl --request PUT \
--url localhost:9200/doc/_mapping \
--header 'content-type: application/json' \
--data '
{
"_meta": {
"presto":{
"array_string_field":{
"asRawJson":true
}
}
}
}'
⚠️ 一个字段不能同时被标注成数组和原生json
查询
全文检索
Trino SQL查询可以与Elasticsearch查询相结合,提供全文查询作为表名的一部分,用冒号分隔。
SELECT * FROM "tweets: +trino SQL^2"
select * from elasticsearch."default"."allcountries: Roc"
谓词下推
predicate push down:将数据过滤尽可能的靠近数据源,以在查询与关联的时候跳过更多的无关数据。
支持谓词下推的数据类型:
Elasticsearch | Trino | 是否支持 |
---|---|---|
binary | VARBINARY | NO |
boolean | BOOLEAN | YES |
double | DOUBLE | YES |
float | REAL | YES |
byte | TINYINT | YES |
short | SMALLINT | YES |
integer | INTEGER | YES |
long | BIGINT | YES |
keyword | VARCHAR | YES |
text | VARCHAR | NO |
date | TIMESTAMP | YES |
ip | IPADDRESS | NO |
sql支持程度
只支持数据查询和一些元数据的查询
Table functions
原生查询raw_query(varchar) -> table
raw_query
函数允许你直接查询底层数据库。这个函数需要Elastic Query DSL语法,因为完整的查询是在Elasticsearch中下推和处理。这对于访问Trino中没有的原生功能或提高查询性能是非常有用的,在这种情况下运行原生查询可能会更快。
传递给底层数据源的原生查询需要返回一个表作为结果集。只有数据源使用自己的配置为这些查询执行验证或安全检查。Trino不执行这些任务。只使用直通式查询来读取数据。
raw_query
函数需要三个参数:
schema
: 要执行查询的目录中的模式。index
: 要搜索的Elasticsearch中的索引。query
: 要执行的查询,用Elastic Query DSL编写。
一旦执行,查询就会返回一条包含Elasticsearch返回的结果JSON有效载荷的单行。(其实结果原生查询的返回结果,满足json格式的字符串)
例如,查询example
目录并使用raw_query
表函数在orders
索引中搜索国家名称为ALGERIA
的文档:
SELECT
*
FROM
TABLE(
example.system.raw_query(
schema => 'sales',
index => 'orders',
query => '{
"query": {
"match": {
"name": "ALGERIA"
}
}
}'
)
);
select
*
from
table(
elasticsearch.system.raw_query(
schema => 'default',
index => 'allcountries',
query => '{
"query": {
"match": {
"name": "China"
}
}
}'
)
);
📓查询引擎不保留这个函数的结果的顺序。如果传递的查询包含一个ORDER BY子句,函数结果可能不会像预期的那样排序。原生查询的排序也需要原生语法支持
查询结果
{"took":3,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":142,"max_score":3.254666,"hits":[{"_index":"allcountries","_type":"_doc","_id":"UCLidYgBOCz7_9E9_5x3","_score":3.254666,"_source":{"name": "Canal Tancada", "geonameid": 3038965, "longitude": 1.55854, "country_code": "AD", "latitude": 42.488990000000001, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"fSLidYgBOCz7_9E9_6F7","_score":3.254666,"_source":{"name": "Canal Gran", "geonameid": 3040296, "longitude": 1.5885499999999999, "country_code": "AD", "latitude": 42.552370000000003, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"tiLidYgBOCz7_9E9_6F8","_score":3.254666,"_source":{"name": "Canal Fosca", "geonameid": 3040353, "longitude": 1.5380199999999999, "country_code": "AD", "latitude": 42.601190000000003, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"tyLidYgBOCz7_9E9_6F8","_score":3.254666,"_source":{"name": "Canal Fosca", "geonameid": 3040354, "longitude": 1.5561499999999999, "country_code": "AD", "latitude": 42.502000000000002, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"gCLidYgBOCz7_9E9_6N9","_score":3.254666,"_source":{"name": "Canal Dreta", "geonameid": 3040817, "longitude": 1.4865900000000001, "country_code": "AD", "latitude": 42.506630000000001, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"HyLidYgBOCz7_9E9_5x3","_score":3.1907582,"_source":{"name": "Canal Torta", "geonameid": 3038916, "longitude": 1.5170600000000001, "country_code": "AD", "latitude": 42.576839999999997, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"eiLidYgBOCz7_9E9_6F7","_score":3.1907582,"_source":{"name": "Canal Gran", "geonameid": 3040293, "longitude": 1.4723900000000001, "country_code": "AD", "latitude": 42.58005, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"gSLidYgBOCz7_9E9_6F7","_score":3.1907582,"_source":{"name": "Canal Gran", "geonameid": 3040300, "longitude": 1.4840100000000001, "country_code": "AD", "latitude": 42.475360000000002, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"3iLidYgBOCz7_9E9_6J9","_score":3.1907582,"_source":{"name": "Canal d’Engolasters", "geonameid": 3040652, "longitude": 1.5842799999999999, "country_code": "AD", "latitude": 42.527250000000002, "population": 0}},{"_index":"allcountries","_type":"_doc","_id":"ICLidYgBOCz7_9E9_5x3","_score":3.0922737,"_source":{"name": "Canal Torta", "geonameid": 3038917, "longitude": 1.5398000000000001, "country_code": "AD", "latitude": 42.551839999999999, "population": 0}}]}}