【问题标题】:Elasticsearch 5.x.x cannot disable dynamic mappingElasticsearch 5.x.x 无法禁用动态映射
【发布时间】:2016-11-24 11:54:12
【问题描述】:

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

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”不会被索引,因为它没有在映射中定义。那么为什么它仍然被索引?我错过了什么吗?

更新

事实证明,目前在 5.0.0 版本中无法执行我想要的操作,因此我在发送到 elasticsearch 之前删除了我的应用程序中的字段并获得了相同的最终结果。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    变通方法

    1. 如果不是这种情况,请尝试在以下情况下禁用 default mapping 您正在创建索引。

    2. 尝试将属性dynamic 变为strict

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

    如果以上两个都不起作用,请尝试将index_mapper_dynamic设置为false。这个SO 可能很方便。希望对您有所帮助。

    【讨论】:

    • 是的,源过滤确实有效,但这并不是我真正想要做的。我根本不希望额外的字段甚至进入索引,我希望它们完全被忽略。而且 strict 也不起作用,因为它拒绝整个文档,而不仅仅是额外的字段。我认为这不可能用当前版本做我想要的,我认为我必须在发送到 Elasticsearch 之前删除我的应用层中的字段。
    • @deRaad 是的,这似乎是唯一的选择。在进行映射之前制作index_mapper_dynamic:false 怎么样。 “设置”:{“index.mapper.dynamic”:假。我已经更新了答案。 },
    • 我假设 strictfalse 是相同的,如果我是云托管的并且目前无法查看服务器日志:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2014-05-28
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多