Mapper与现有映射冲突

时间:2016-06-04 10:12:57

标签: java elasticsearch

我有关于索引类型属性的更新分析器的问题。我已经阅读了这种错误的问题here。但事实并非如此,因为我只有一种索引类型(体验)并且它是唯一的,它不可能有冲突。这是来自elasticsearch 2.3。

映射

(get "/public-search/_mapping/developer")

{:public-search {:mappings {:developer {:properties {:db/id {:type "long"}, :developer/description {:type "string"}, :developer/established-date {:type "date", :format "strict_date_optional_time||epoch_millis"}, :developer/logo-url {:type "string"}, :developer/name {:type "string"}, :developer/total-project {:type "long"}}}}}}

// I do have autocomplete analyzer in settings
(put "/public-search/_mapping/developer"
       {:properties {:developer/name {:type "string"
                                      :analyzer "autocomplete"}}})

{:error {:root_cause [{:type "illegal_argument_exception", :reason "Mapper for [developer/name] conflicts with existing mapping in other types:\n[mapper [developer/name] has different [analyzer]]"}], :type "illegal_argument_exception", :reason "Mapper for [developer/name] conflicts with existing mapping in other types:\n[mapper [developer/name] has different [analyzer]]"}, :status 400}

如果我在将数据放入其中之前创建映射就可以了。但是我仍然在运行时更新映射。 在这种情况下可能出现什么问题?谢谢你提前。

1 个答案:

答案 0 :(得分:2)

如果我在将数据放入其中之前创建映射就可以了。

这只是说了一遍,不是吗?

如果您首先插入数据而没有映射,ES将猜测您的数据类型,然后根据它创建映射。看看ES为您的数据生成的映射。

我建议,它并不完全是您想要创建的映射。

简单示例:插入"字符串" 2016-01-01T00:00:00.000Z。即使你想要一个字符串字段,ES也会创建一个日期时间字段。为了获得字符串字段,您必须在插入数据之前创建映射。

此外,ES无法猜测分析仪等。并且它(如果我没记错的话)在插入数据后无法覆盖它们。