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

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

在今天的文章里,我来介绍一下 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
{"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"
}

相关文章:

  • webrtc兼容android4.x的一次探索
  • 深度学习之基于Tensorflow卷积神经网络鸟类目标识别检测系统
  • 3.1.2 Linux时间子系统 hrtimer示例使用
  • Rust语言入门教程(一) - 简介及Cargo使用
  • MySQL MHA高可用架构搭建
  • SELinux零知识学习三十二、SELinux策略语言之角色和用户(3)
  • 【C++干货铺】非类型模板 | 模板特化 | 模板分离编译
  • 【C4D如何将多个选集设置为一个选集】
  • 前端(HTML + CSS + JS)
  • 成品日志函数
  • Scrapy爬虫异步框架(一篇文章齐全)
  • 插入排序(形象类比)
  • ubuntu修改系统语言
  • Windows系统管理之备份与恢复
  • PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CentOS7简单部署NFS
  • css属性的继承、初识值、计算值、当前值、应用值
  • SpingCloudBus整合RabbitMQ
  • 笨办法学C 练习34:动态数组
  • 从零开始学习部署
  • 基于webpack 的 vue 多页架构
  • 计算机常识 - 收藏集 - 掘金
  • 检测对象或数组
  • 你真的知道 == 和 equals 的区别吗?
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 设计模式走一遍---观察者模式
  • 在weex里面使用chart图表
  • 怎么将电脑中的声音录制成WAV格式
  • 智能网联汽车信息安全
  • 中文输入法与React文本输入框的问题与解决方案
  • 走向全栈之MongoDB的使用
  • hi-nginx-1.3.4编译安装
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (arch)linux 转换文件编码格式
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET序列化 serializable,反序列化
  • [ linux ] linux 命令英文全称及解释
  • [1127]图形打印 sdutOJ
  • [20140403]查询是否产生日志
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Android 13]Input系列--获取触摸窗口
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C#]猫叫人醒老鼠跑 C#的委托及事件