【Trino实战】Elasticsearch Connector辅助说明

Elasticsearch Connector

文章目录

  • Elasticsearch Connector
    • 要求与配置
    • 特殊情况的处理
      • 数组类型的处理
      • 原始JSON(RawJson)的处理
    • 查询
      • 全文检索
      • 谓词下推
      • sql支持程度
    • Table functions
      • 原生查询`raw_query(varchar) -> table`

要求与配置

对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}}]}}

你可能感兴趣的:(Trino,elasticsearch,搜索引擎,大数据)