当前位置: 首页 > article >正文

Elasticsearch:ES|QL 查询中的元数据字段及多值字段

在今天的文章里,我来介绍一下 ES|QL 里的元数据字段以及多值字段。我们可以利用这些元数据字段以及多值字段来针对我们的查询进行定制。这里例子的数据集,请参考文章 “Elasticsearch:ES|QL 快速入门”。

ES|QL 源数据字段

ES|QL 可以访问元数据字段。 目前支持的有:

  • _index:文档所属的索引名称。 该字段的类型为关键字。
  • _id:源文档的 ID。 该字段的类型为关键字。
  • _version:源文档的版本。 该字段的类型为 long。

要启用对这些字段的访问,需要为 FROM source 命令提供专用指令:

FROM index [METADATA _index, _id]

仅当数据源是索引时元数据字段才可用。 因此,FROM 是唯一支持 METADATA 指令的源命令。比如,

POST _query?format=txt
{
  "query": """
    FROM sample_data [METADATA _index, _id]
    | LIMIT 3
  """
}

从上面的返回数据中,我们可以看到 _index 及 _id 返回索引名称 sample_data 及文档的 ID。

POST _query?format=txt
{
  "query": """
    FROM sample_data [METADATA _index, _id,  _version]
    | LIMIT 3
    | WHERE _version == 1
    | EVAL key = CONCAT(_index, "_", _id)
    | KEEP _index, _version, _id, key
  """
}

此外,与索引字段类似,一旦执行聚合,后续命令将无法再访问元数据字段,除非用作分组字段:

POST _query?format=txt
{
  "query": """
    FROM sample_data [METADATA _index, _id]
    | STATS max= MAX(event.duration) BY _index
  """
}

ES|QL 多值字段

ES|QL 可以很好地读取多值字段。多值字段也就是在一个字段里有多个值。通常是以数组的形式出现。

POST /mv/_bulk?refresh
{"index":{}}
{"a":1,"b":[2,1]}
{"index":{}}
{"a":2,"b":3}

多值字段以 txt 数组的形式返回:

POST /_query?format=txt
{
  "query": "FROM mv | LIMIT 2"
}

多值字段中值的相对顺序未定义。 它们通常会按升序排列,但不要依赖于此。

重复值

某些字段类型(例如关键字)在写入时删除重复值:

DELETE mv
PUT /mv
{
  "mappings": {
    "properties": {
      "b": {"type": "keyword"}
    }
  }
}
POST /mv/_bulk?refresh
{"index":{}}
{"a":1,"b":["foo","foo","bar"]}
{"index":{}}
{"a":2,"b":["bar","bar"]}
POST /_query?format=txt
{
  "query": "FROM mv | LIMIT 2"
}

在 ES|QL 查询结果里,我们看到了该删除。

但其他类型(例如 long)不会删除重复项。

DELETE mv
PUT /mv
{
  "mappings": {
    "properties": {
      "b": {"type": "long"}
    }
  }
}
POST /mv/_bulk?refresh
{"index":{}}
{"a":1,"b":[2,2,1]}
{"index":{}}
{"a":2,"b":[1,1]}
POST /_query?format=txt
{
  "query": "FROM mv | LIMIT 2"
}

这都是在存储层。 如果你存储重复的 “long”,然后将它们转换为字符串,则重复项将保留:

DELETE mv
PUT /mv
{
  "mappings": {
    "properties": {
      "b": {"type": "long"}
    }
  }
}
POST /mv/_bulk?refresh
{"index":{}}
{"a":1,"b":[2,2,1]}
{"index":{}}
{"a":2,"b":[1,1]}
POST /_query?format=txt
{
  "query": "FROM mv | EVAL b=TO_STRING(b) | LIMIT 2"
}

函数

除非另有说明,函数在应用于多值字段时将返回 null。 此行为可能会在更高版本中改变。

DELETE mv
POST /mv/_bulk?refresh
{"index":{}}
{"a":1,"b":[2,1]}
{"index":{}}
{"a":2,"b":3}
POST /_query?format=txt
{
  "query": "FROM mv | EVAL b + 2, a + b | LIMIT 4"
}

通过使用以下之一将字段转换为单个值来解决此限制:

  • MV_AVG
  • MV_CONCAT
  • MV_COUNT
  • MV_MAX
  • MV_MEDIAN
  • MV_MIN
  • MV_SUM
POST /_query?format=txt
{
  "query": "FROM mv | EVAL b=MV_MIN(b) | EVAL b + 2, a + b | LIMIT 4"
}


http://www.kler.cn/a/147535.html

相关文章:

  • Zero、Zero-Offload、Zero-Infinity是什么
  • C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介
  • ADC输出码和输入电压转换关系
  • 计算机网络 (4)计算机网络体系结构
  • Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!
  • SpringCloud-使用FFmpeg对视频压缩处理
  • PHP定义的变量 常量 静态变量等储存在内存什么位置?
  • ESP32-Web-Server编程-HTML 基础
  • 适用于iOS 的顶级苹果数据恢复软件
  • 爬虫爬取百度图片、搜狗图片
  • JAVA将PDF转图片
  • java大视频在线预览(支持断点下载)
  • 超全超实用行业解决方案合集,覆盖十大行业数据应用需求
  • 基于Webserver的工业数据采集控制
  • 查swap内存使用
  • windows dockerdesktop 安装sqlserver2022
  • vue3中的customRef创建一个自定义的 ref对象
  • CCC联盟数字钥匙(一)——UWB MAC概述
  • barcode.js+elementUi——实现二维码的展示——基础积累
  • 21款奔驰GLE350升级迈巴赫踏板 老人小孩 上下车更加简单
  • Figma 插件学习(二)- 常用属性和方法
  • 基于vue的全民生鲜网上商城
  • 前端 HTML 和 JavaScript 的基础知识有哪些?
  • 纯新手发布鸿蒙的第一个java应用
  • Linux telnet命令详解:通过TCP/IP网络连接与管理远程机器(附实例教程和注意事项)
  • Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业