前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch探索:flattened 数据类型(7.3版新功能)

Elasticsearch探索:flattened 数据类型(7.3版新功能)

作者头像
HLee
修改2021-01-05 14:30:37
8710
修改2021-01-05 14:30:37
举报
文章被收录于专栏:房东的猫房东的猫

简介

官方地址:https://www.elastic.co/guide/en/elasticsearch/reference/master/flattened.html

默认情况下,对象中的每个子字段都需要分别进行映射和索引。如果事先不知道子字段的名称或类型,则将动态映射它们。

flattened 数据类型提供了一种替代方法,其中将整个对象映射为单个字段。对于给定的对象,flatten 类型映射将解析出其 leaf 值并将它们作为关键字索引到一个字段中。然后可以通过简单的查询和汇总来搜索对象的内容。

此数据类型对于索引具有大量或未知数量的唯一键的对象很有用。仅为整个 JSON 对象创建一个字段映射,这可以帮助防止由于大量不同的字段映射而导致映射爆炸

另一方面,flatten的对象字段在搜索功能方面存在折衷。仅允许基本查询,不支持数字范围查询或高亮显示(highlighting)。

flattened类型

在使用 flattened 数据类型时,必须注意的是:

flattened 的映射类型不应用于索引所有文档内容,因为它将所有值都视为关键字,并且不提供完整的搜索功能。 在大多数情况下,默认方法(每个子字段在映射中都有其自己相对应的项)有效。

下面我们来用一个例子来展示如何使用 flattened 数据类型的用法。我们首先来创建一个叫做 bug_reports 的索引及它的 mapping:

代码语言:javascript
复制
PUT bug_reports
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "labels": {
        "type": "flattened"
      }
    }
  }
}

在上面,我们定义labels的数据类型为flattened,意味着这个字段可以用来保持一个对象。我们用一下的方法来创建一个文档:

代码语言:javascript
复制
POST bug_reports/_doc/1
{
  "title": "Results are not sorted correctly.",
  "labels": {
    "priority": "urgent",
    "release": [
      "v1.2.5",
      "v1.3.0"
    ],
    "timestamp": {
      "created": 1541458026,
      "closed": 1541457010
    }
  }
}

在上面我们可以看出来: labels是一个对象,它包含 priority, release 及 timestamp leaf 项。在建立索引的时候,Elasticsearch 为JSON 对象的每一个 leaf 建立 token,这些值被索引为字符串关键字,无需对数字或日期进行特殊处理。针对我们的情况,Elasticsearch 在建立索引时,会对 urgent,v1.2.5, v1.3.0, 1541458026及1541457010建立 token, 并供我们进行搜索。

我们可以通过如下的方式来进行查询:

代码语言:javascript
复制
POST bug_reports/_search
{
  "query": {
    "term": {
      "labels": "urgent"
    }
  }
}

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.27101856,
    "hits" : [
      {
        "_index" : "bug_reports",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.27101856,
        "_source" : {
          "title" : "Results are not sorted correctly.",
          "labels" : {
            "priority" : "urgent",
            "release" : [
              "v1.2.5",
              "v1.3.0"
            ],
            "timestamp" : {
              "created" : 1541458026,
              "closed" : 1541457010
            }
          }
        }
      }
    ]
  }
}

同样,我们可以对数值进行查询:

代码语言:javascript
复制
POST bug_reports/_search
{
  "query": {
    "term": {
      "labels": 1541458026
    }
  }
}

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.27101856,
    "hits" : [
      {
        "_index" : "bug_reports",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.27101856,
        "_source" : {
          "title" : "Results are not sorted correctly.",
          "labels" : {
            "priority" : "urgent",
            "release" : [
              "v1.2.5",
              "v1.3.0"
            ],
            "timestamp" : {
              "created" : 1541458026,
              "closed" : 1541457010
            }
          }
        }
      }
    ]
  }
}

要查询flattened对象中的特定键,请使用“."来表示:

代码语言:javascript
复制
POST bug_reports/_search
{
  "query": {
    "term": {
      "labels.release": "v1.3.0"
    }
  }
}

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.27101856,
    "hits" : [
      {
        "_index" : "bug_reports",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.27101856,
        "_source" : {
          "title" : "Results are not sorted correctly.",
          "labels" : {
            "priority" : "urgent",
            "release" : [
              "v1.2.5",
              "v1.3.0"
            ],
            "timestamp" : {
              "created" : 1541458026,
              "closed" : 1541457010
            }
          }
        }
      }
    ]
  }
}

支持的操作

由于索引值的方式相似,flattened 字段与 keyword 字段共享许多相同的映射和搜索功能,这是因为它们在建立索引时的方式非常相似。

目前,flattened的对象字段可以与以下查询类型一起使用:

  • termterms, and terms_set
  • prefix
  • range
  • match and multi_match
  • query_string and simple_query_string
  • exists

查询时,不可能使用通配符来引用字段关键字,例如 {“ term”:{“ labels.time *”:1541457010}}。 请注意,所有查询(包括范围)都将值视为字符串关键字。 拼合的字段不支持高亮显示(highlighting)。

可以对 flattened 的对象字段进行排序,以及执行简单的关键字样式聚合(例如terms aggregation)。 与查询一样,对数字没有特殊支持-将 JSON 对象中的所有值都视为关键字。 排序时,这意味着按字典顺序对值进行比较。

展平的对象字段当前无法存储。 无法在映射中指定store参数。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • flattened类型
  • 支持的操作
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档