我对trino很陌生,我试图用它来查询弹性搜索中嵌套的对象。
这是我在elasticsearch中的映射:
{
"product_index": {
"mappings": {
"properties" :{
"id" : { "type" : "keyword"},
"name" { "type" : "keyword"},
"linked_products" :{
"type": "nested",
"properties" :{
"id" : { "type" : "keyword"}
}
}
}
}
}
}我需要对linked_products下的id字段执行查询。trino中对id字段执行查询的语法是什么?是否需要使用弹性目标索引映射的特殊定义来映射trino的嵌套部分?
=========================================================
嗨,我试着在我的问题上补充一些澄清。
我们试图根据id字段查询数据。这是弹性中的查询:
get product_index/_search
{
"query": {
"nested" : {
"path" : "linked_products",
"query": {
"bool": {
"should" : [
{ "match" : {"linked_products.id" :123}}
]
}
}
}
}
}我们尝试以两种方式查询id字段:
当我们尝试根据id字段进行查询时,就不会发生下推到弹性,并且连接器将所有文档检索到trino (仅在嵌套文档的查询中才会发生这种情况)。
发布于 2021-06-04 20:38:59
Trino将nested对象类型映射到ROW,就像它在读取期间映射标准object类型一样。nested名称本身对Trino没有任何用处,因为它只确定对象如何存储在Elasticsearch中。
假设我们将以下文档推送到您的索引中。
curl -X POST "localhost:9200/product_index/_doc?pretty"
-H 'Content-Type: application/json' -d'
{
"id": "1",
"name": "foo",
"linked_products": {
"id": "123"
}
}
'在Trino中读出来的方法就是使用标准的ROW语法。
SELECT
id,
name,
linked_products.id
FROM elasticsearch.default.product_index;结果:
|id |name|id |
|---|----|---|
|1 |foo |123|这很好,但是从嵌套对象的名称是复数的事实来看,我假设您希望存储这样的对象数组。
curl -X POST "localhost:9200/product_index/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"id": "2",
"name": "bar",
"linked_products": [
{
"id": "123"
},
{
"id": "456"
}
]
}
'如果您运行与上面相同的查询,插入了第二个文档,您将得到以下错误。
SQL Error [58]: Query failed (#20210604_202723_00009_nskc4): Expected object for field 'linked_products' of type ROW: [{id=123}, {id=456}] [ArrayList]这是因为,Trino无法从默认的Elasticsearch映射中知道哪些字段是数组。因此,要启用对这个数组的查询,您需要遵循文档中的说明,使用_meta字段在Trino中显式地将该字段标识为数组类型。下面是本例中用于将linked_products索引为ARRAY的命令。
curl --request PUT \
--url localhost:9200/product_index/_mapping \
--header 'content-type: application/json' \
--data '
{
"_meta": {
"presto":{
"linked_products":{
"isArray":true
}
}
}
}'现在,您需要在SELECT语句中说明linked_products是一个类型为ROW的ARRAY。并不是所有的索引都有值,所以您应该使用索引安全的element_at函数来避免错误。
SELECT
id,
name,
element_at(linked_products, 1).id AS id1,
element_at(linked_products, 2).id AS id2
FROM elasticsearch.default.product_index;结果:
|id |name|id1|id2 |
|---|----|---|----|
|1 |foo |123|NULL|
|2 |bar |123|456 |=========================================================
更新回答@吉尔鲍伯更新的问题。
elasticsearch.request-timeout文件中设置elasticsearch.properties属性,以增加请求超时,作为解决办法,直到出现下推。如果要花这么长时间才能返回Elasticsearch,那么无论您在Trino还是Elasticsearch中运行聚合,都需要设置它。https://stackoverflow.com/questions/67667313
复制相似问题