2016-11-23 88 views
1

我试图简单地禁用在索引创建时在映射中未明确定义的任何字段的动态映射。没有什么会的工作,所以我甚至试过在他们的文档的例子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之前,取得相同的最终结果。

回答

0

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

变通

  1. 如果不是的情况下,尝试禁用default mapping时 要创建的索引。

  2. 尝试使财产dynamicstrict

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

如果以上两种不工作了,请尝试index_mapper_dynamic为false。这SO可能会得心应手。希望能帮助到你。

+0

是的源过滤确实有效,但这不是我想要做的。我不希望额外的字段甚至可以输入索引,我希望它们完全被忽略。严格也不会工作,因为它拒绝整个文件,而不仅仅是额外的领域。我不认为这是可能做到我想要的当前版本,我想我必须在发送到Elasticsearch之前删除我的应用层中的字段。 –

+0

@deRaad yup似乎是唯一的选择。如何在执行映射之前制作'index_mapper_dynamic:false'。 “settings”:{ “index.mapper.dynamic”:false。我已经更新了答案。 }, – Kulasangar