【Trino实战】Elasticsearch Connector辅助说明

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 nameDescriptionDefault
elasticsearch.host以逗号分隔的Elasticsearch节点连接的主机名称列表。这个属性是必需的。
elasticsearch.port要连接的Elasticsearch节点的端口。9200
elasticsearch.default-schema-name包含所有没有限定模式名称的定义的表的模式。default
elasticsearch.scroll-size设置每个Elasticsearch滚动请求所能返回的最大点击数。1000
elasticsearch.scroll-timeoutElasticsearch为滚动请求保持搜索上下文的超时时长。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 nameDescription
elasticsearch.auth.user用户登录名称
elasticsearch.auth.password用户密码

字段类型映射

Elasticsearch typeTrino typeNotes
BOOLEANBOOLEAN
DOUBLEDOUBLE
FLOATREAL
BYTETINYINT
SHORTSMALLINT
INTEGERINTEGER
LONGBIGINT
KEYWORDVARCHAR
TEXTVARCHAR
DATETIMESTAMPElasticsearch支持大量的日期格式,包括内置日期格式和自定义日期格式。Elasticsearch连接器只支持默认的日期类型。所有其他的日期格式,包括内置日期格式和自定义日期格式,都不被支持。带有格式属性的日期会被忽略。
IPADDRESSIP

特殊情况的处理

数组类型的处理

借助索引的元信息配置(_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:将数据过滤尽可能的靠近数据源,以在查询与关联的时候跳过更多的无关数据。

支持谓词下推的数据类型:

ElasticsearchTrino是否支持
binaryVARBINARYNO
booleanBOOLEANYES
doubleDOUBLEYES
floatREALYES
byteTINYINTYES
shortSMALLINTYES
integerINTEGERYES
longBIGINTYES
keywordVARCHARYES
textVARCHARNO
dateTIMESTAMPYES
ipIPADDRESSNO

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}}]}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顧棟

若对你有帮助,望对作者鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值