首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带弹性的Trino/presto :如何搜索嵌套对象?

带弹性的Trino/presto :如何搜索嵌套对象?
EN

Stack Overflow用户
提问于 2021-05-24 06:02:19
回答 1查看 1.4K关注 0票数 1

我对trino很陌生,我试图用它来查询弹性搜索中嵌套的对象。

这是我在elasticsearch中的映射:

代码语言:javascript
复制
{
"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字段查询数据。这是弹性中的查询:

代码语言:javascript
复制
get product_index/_search
{ 
"query": {
"nested" : {
"path" : "linked_products",
"query": {
"bool": {
"should" : [
{ "match" : {"linked_products.id" :123}}
]
}
}
}
}
}

我们尝试以两种方式查询id字段:

  1. Trino查询-从es_table aaa中选择count(*),其中any_match(aaa.linked_products,x-> x.id=123)

当我们尝试根据id字段进行查询时,就不会发生下推到弹性,并且连接器将所有文档检索到trino (仅在嵌套文档的查询中才会发生这种情况)。

  1. 发送es-查询从trino到弹性: SELECT *从es.default。“$query:”它可以工作,但当我们试图检索id与许多文档,我们从弹性客户端超时。从文档中我无法理解,当我们使用es-query来避免超时问题时,是否可以执行滚动。
EN

回答 1

Stack Overflow用户

发布于 2021-06-04 20:38:59

Trino将nested对象类型映射到ROW,就像它在读取期间映射标准object类型一样。nested名称本身对Trino没有任何用处,因为它只确定对象如何存储在Elasticsearch中。

假设我们将以下文档推送到您的索引中。

代码语言:javascript
复制
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语法。

代码语言:javascript
复制
SELECT 
  id, 
  name, 
  linked_products.id 
FROM elasticsearch.default.product_index;

结果:

代码语言:javascript
复制
|id |name|id |
|---|----|---|
|1  |foo |123|

这很好,但是从嵌套对象的名称是复数的事实来看,我假设您希望存储这样的对象数组。

代码语言:javascript
复制
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"
    }
  ]
}
'

如果您运行与上面相同的查询,插入了第二个文档,您将得到以下错误。

代码语言:javascript
复制
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的命令。

代码语言:javascript
复制
curl --request PUT \
    --url localhost:9200/product_index/_mapping \
    --header 'content-type: application/json' \
    --data '
{
    "_meta": {
        "presto":{
            "linked_products":{
                "isArray":true
            }
        }
    }
}'

现在,您需要在SELECT语句中说明linked_products是一个类型为ROWARRAY。并不是所有的索引都有值,所以您应该使用索引安全的element_at函数来避免错误。

代码语言:javascript
复制
SELECT 
  id, 
  name,
  element_at(linked_products, 1).id AS id1, 
  element_at(linked_products, 2).id AS id2 
FROM elasticsearch.default.product_index;

结果:

代码语言:javascript
复制
|id |name|id1|id2 |
|---|----|---|----|
|1  |foo |123|NULL|
|2  |bar |123|456 |

=========================================================

更新回答@吉尔鲍伯更新的问题。

  1. 当前,在Elasticsearch连接器中不支持下推聚合,但这是在PR 7131中添加的。
  2. 您可以在您的elasticsearch.request-timeout文件中设置elasticsearch.properties属性,以增加请求超时,作为解决办法,直到出现下推。如果要花这么长时间才能返回Elasticsearch,那么无论您在Trino还是Elasticsearch中运行聚合,都需要设置它。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67667313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档