Elasticsearch 5.x.x不能禁用动态映射



我试图简单地禁用在索引创建时间映射中未明确定义的任何字段的动态映射。什么都没有用,所以我什至尝试了他们的文档中的示例

PUT my_index
{
  "mappings": {
    "my_type": {
      "dynamic": false,
      "properties": {
        "user": {
          "type": "text"
        }
      }
    }
  }
}

制作了测试插入:

POST my_index/my_type
{
  "user": "tester",
  "some_unknown_field": "lsdkfjsd"
}

然后搜索索引显示:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "AViPrfwVko8c8Q3co8Qz",
        "_score": 1,
        "_source": {
          "user": "tester",
          "some_unknown_field": "lsdkfjsd"
        }
      }
    ]
  }
}

我期望" some_unknown_field"不会被索引,因为它在映射中没有定义。那么,为什么还要索引呢?我想念什么吗?

update

事实证明,目前在5.0.0版中不可能做我想做的事情,因此我在发送到Elasticsearch并获得了相同的最终结果之前删除了应用程序中的字段。

映射的作用是将您的字段作为您提及的字段,当您使用mapping创建索引时。因此,对于您在映射过程中尚未提及任何内容然后尝试插入值的字段,ES始终将其视为一个新字段,并将其添加到default mapping中。因此,如果您不想在_source中看到特定字段,则可以进行一些源过滤。

围绕工作:

  1. 如果不是这种情况,请尝试禁用默认映射您正在创建索引。

  2. 尝试将属性dynamic放入strict

    PUT /test
        {
          "settings": {
            "index.mapper.dynamic": false
          },
          "mappings": {
            "testing_type": {
              "dynamic":"strict",
              "properties": {
                "field1": {
                  "type": "string"
                }
              }
            }
          }
        }

如果以上两个无法解决,请尝试将index_mapper_dynamic变为false。这可能很方便。希望它有帮助。

最新更新