Elasticsearch:添加 metadata 到 mapping 中

有时,当我们处理映射时,需要存储一些其他数据以用于显示目的,ORM设施,权限,或者只是在映射中跟踪它们。
Elasticsearch允许您使用特殊的_meta字段在映射中存储所需的每种JSON数据。映射类型可以具有与之关联的自定义元数据。 Elasticsearch完全不使用这些,但是可以用于存储特定于应用程序的元数据。那么我们该如何实现呢?

_meta映射字段可以填充我们想要的任何数据。 考虑以下示例:

PUT twitter
{
  "mappings": {
    "_meta" : {
      "attr1": ["value1", "value2"],
      "attr2": {
        "attr3": "value3"
      }
    },
    "properties": {
      "content": {
        "type": "text"
      }
    }
  }
}

这个 _meta 字段独立于任何的文档而存在。我们可以通过如下的方法来获取它:

GET twitter/_mapping
{
  "twitter" : {
    "mappings" : {
      "_meta" : {
        "attr2" : {
          "attr3" : "value3"
        },
        "attr1" : [
          "value1",
          "value2"
        ]
      },
      "properties" : {
        "content" : {
          "type" : "text"
        }
      }
    }
  }
}

在上面,我们可以看到返回的 _meta 字段。

我们也可以使用如下的方法来对它进行更新:

PUT twitter/_mapping
{
  "_meta": {
    "attr1": [
      "value5",
      "value6"
    ],
    "attr2": {
      "attr3": "value7"
    }
  },
  "properties": {
    "content": {
      "type": "text"
    }
  }
}

那么我们再次获取这个索引的更新:

GET twitter/_mapping
  "twitter" : {
    "mappings" : {
      "_meta" : {
        "attr2" : {
          "attr3" : "value7"
        },
        "attr1" : [
          "value5",
          "value6"
        ]
      },
      "properties" : {
        "content" : {
          "type" : "text"
        }
      }
    }
  }
}

当 Elasticsearch 处理新的映射并找到 _meta 字段时,它将其存储在全局映射状态中,并将信息传播到所有集群节点。
_meta仅用于存储目的; 它不是索引和可搜索的。


可以出于以下原因使用它:

  • 存储类型元数据
  • 存储对象关系映射(ORM)相关信息
  • 存储类型许可信息
  • 存储额外的类型信息(即用于显示类型)
  • 存储用于渲染Web界面的模板部件

 

参考:

【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-meta-field.html