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"
}

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

相关推荐
程序新视界14 分钟前
如何选择合适的数据库?PostgreSQL与MySQL各项对比
数据库·mysql·postgresql
JXY_AI1 小时前
AI问答与搜索引擎:信息获取的现状
人工智能·搜索引擎
B站_计算机毕业设计之家1 小时前
Python+Flask+Prophet 汽车之家二手车系统 逻辑回归 二手车推荐系统 机器学习(逻辑回归+Echarts 源码+文档)✅
大数据·人工智能·python·机器学习·数据分析·汽车·大屏端
EkihzniY2 小时前
医疗发票 OCR 识别:打通医疗费用处理 “堵点” 的技术助手
大数据·人工智能·ocr
明月与玄武2 小时前
SQL核心语言详解:DQL、DML、DDL、DCL从入门到实践!
数据库·sql核心语言详解·dql、dml、ddl、dcl
乐迪信息2 小时前
乐迪信息:智慧煤矿输送带安全如何保障?AI摄像机全天候识别
大数据·运维·人工智能·安全·自动化·视觉检测
阿里云大数据AI技术3 小时前
云栖实录|人工智能+大数据平台加速企业模型后训练
大数据·人工智能
dongchen。3 小时前
MySQL第一次作业
数据库·mysql
B站_计算机毕业设计之家3 小时前
数据分析:Python懂车帝汽车数据分析可视化系统 爬虫(Django+Vue+销量分析 源码+文档)✅
大数据·爬虫·python·数据分析·汽车·可视化·懂车帝
康妮猫4 小时前
建模的终点,是WPS/Office
数据库·学习