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

在今天的文章里,我来介绍一下 ES|QL 里的元数据字段以及多值字段。我们可以利用这些元数据字段以及多值字段来针对我们的查询进行定制。

ES|QL 源数据字段

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

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

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

css 复制代码
FROM index [METADATA _index, _id]

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

python 复制代码
1.  POST _query?format=txt
2.  {
3.    "query": """
4.      FROM sample_data [METADATA _index, _id]
5.      | LIMIT 3
6.    """
7.  }

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

python 复制代码
1.  POST _query?format=txt
2.  {
3.    "query": """
4.      FROM sample_data [METADATA _index, _id,  _version]
5.      | LIMIT 3
6.      | WHERE _version == 1
7.      | EVAL key = CONCAT(_index, "_ ", _id)
8.      | KEEP _index, _version, _id, key
9.    """
10.  }

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

python 复制代码
1.  POST _query?format=txt
2.  {
3.    "query": """
4.      FROM sample_data [METADATA _index, _id]
5.      | STATS max= MAX(event.duration) BY _index
6.    """
7.  }

ES|QL 多值字段

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

css 复制代码
1.  POST /mv/_bulk?refresh
2.  {"index":{}}
3.  {"a":1,"b":[2,1]}
4.  {"index":{}}
5.  {"a":2,"b":3}

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

bash 复制代码
1.  POST /_query
2.  {
3.    "query": "FROM mv | LIMIT 2"
4.  }

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

重复值

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

markdown 复制代码
1.  DELETE mv
2.  PUT /mv
3.  {
4.    "mappings": {
5.      "properties": {
6.        "b": {"type": "keyword"}
7.      }
8.    }
9.  }
css 复制代码
1.  POST /mv/_bulk?refresh
2.  {"index":{}}
3.  {"a":1,"b":["foo","foo","bar"]}
4.  {"index":{}}
5.  {"a":2,"b":["bar","bar"]}
bash 复制代码
1.  POST /_query?format=txt
2.  {
3.    "query": "FROM mv | LIMIT 2"
4.  }

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

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

markdown 复制代码
1.  DELETE mv
2.  PUT /mv
3.  {
4.    "mappings": {
5.      "properties": {
6.        "b": {"type": "long"}
7.      }
8.    }
9.  }
css 复制代码
1.  POST /mv/_bulk?refresh
2.  {"index":{}}
3.  {"a":1,"b":[2,2,1]}
4.  {"index":{}}
5.  {"a":2,"b":[1,1]}
bash 复制代码
1.  POST /_query?format=txt
2.  {
3.    "query": "FROM mv | LIMIT 2"
4.  }

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

markdown 复制代码
1.  DELETE mv
2.  PUT /mv
3.  {
4.    "mappings": {
5.      "properties": {
6.        "b": {"type": "long"}
7.      }
8.    }
9.  }
css 复制代码
1.  POST /mv/_bulk?refresh
2.  {"index":{}}
3.  {"a":1,"b":[2,2,1]}
4.  {"index":{}}
5.  {"a":2,"b":[1,1]}
bash 复制代码
1.  POST /_query?format=txt
2.  {
3.    "query": "FROM mv | EVAL b=TO_STRING(b) | LIMIT 2"
4.  }

函数

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

bash 复制代码
1.  DELETE mv
2.  POST /mv/_bulk?refresh
3.  {"index":{}}
4.  {"a":1,"b":[2,1]}
5.  {"index":{}}
6.  {"a":2,"b":3}
bash 复制代码
1.  POST /_query?format=txt
2.  {
3.    "query": "FROM mv | EVAL b + 2, a + b | LIMIT 4"
4.  }

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

less 复制代码
1.  POST /_query?format=txt
2.  {
3.    "query": "FROM mv | EVAL b=MV_MIN(b) | EVAL b + 2, a + b | LIMIT 4"
4.  }
相关推荐
Elastic 中国社区官方博客3 小时前
Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jina
隔壁老王1563 小时前
mysql实时同步到es
数据库·mysql·elasticsearch
SunnyRivers4 小时前
关于ES中text类型时间字段范围查询的结构化解决方案
elasticsearch·时间·text·范围查询
API_technology5 小时前
电商搜索API的Elasticsearch优化策略
大数据·elasticsearch·搜索引擎
stone.eye8 小时前
阿里云通过docker安装skywalking及elasticsearch操作流程
elasticsearch·阿里云·docker·skywalking
fruge13 小时前
git上传 项目 把node_modules也上传至仓库了,在文件.gitignore 中忽略node_modules 依然不行
大数据·git·elasticsearch
飞火流星0202716 小时前
ElasticSearch公共方法封装
elasticsearch·搜索引擎·es鉴权·es代理访问·es公共方法封装·es集群访问·判断es索引是否存在
vvvae123417 小时前
Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路
elasticsearch
yinbp17 小时前
bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全
大数据·elasticsearch·微服务·etl·restclient·bboss
m0_7482550217 小时前
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
spring boot·elasticsearch·jenkins