elasticsearch未知设置index.include_type_name



我的处境非常奇怪,我需要在弹性搜索中创建包含无类型字段的索引。我有一个rails应用程序,它每秒向我的弹性搜索发送任何数据。关于我的架构,我不得不说,我在ubuntu服务器中使用了docker上的弹性堆栈,并使用套接字将数据发送到elk,所有这些都是最新版本。

在我的rails应用程序中,用户可以为每个字段选择数据类型,但当用户想在创建一个字段后立即更改该字段的数据类型时,就会出现问题,logstash返回此错误

error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [field] of type [long] in document with id '5e760cac-cafc-4fd0-9e45-1c650967ccd4'. Preview of field's value: '2022-01-18T08:06:30'", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"For input string: "2022-01-18T08:06:30

我发现了致命的队列字母插件,可以在我的服务器中保存错误的输入。之后,我想如果我可以在没有任何类型的文档中编制索引,问题就解决了。所以我开始在谷歌上搜索,发现在弹性搜索文档中删除了映射类型,我按照教程中描述的说明进行操作。我得到了以下错误:

unknown setting [index.include_type_name] please check that any required plugins are installed, or check the breaking changes documentation for removed settings

甚至我把";include_type_name"在发送给弹性的请求中注明更改我有弹性的最新版本。

我认为编辑默认的弹性搜索模板可能会有所帮助,但要注意更改。你能帮我做什么吗?

正如评论中所提到的,Elasticsearch不支持在没有重新索引或创建新索引的情况下更改字段的数据类型。

例如,如果一个字段被映射为像integer这样的数字字段,并且用户希望在该字段中为字符串值编制索引,则elasticsearch将返回映射错误。

您需要更改索引的映射并重新为其建立索引,或者使用新映射创建一个全新的索引。

所有这些都不是弹性自动完成的,您需要在应用程序中处理这一问题,您可以捕捉错误并实现一些逻辑来创建具有新映射的新索引,但这也可能导致其他问题,如集群中的索引过多,以及当查询范围包括具有不同映射的同一字段的索引时出现查询错误。

Elasticsearch的一个功能可以在某种程度上帮助您,那就是运行时字段,使用运行时字段可以使用不同的映射查询具有特定映射的字段。

例如,如果您有一个具有日期值的字段,但被错误地映射为关键字或文本字段,则可以使用运行时字段将其作为日期字段进行查询。

但同样,这需要实现一个逻辑来构建这些运行时字段,这也可能导致其他问题,因为并非所有数据类型都可用于运行时字段并且运行时字段可能会影响性能。

另一个可以帮助您的功能是使用多字段,我认为这是最接近于拥有多个数据类型的字段的功能。

使用多字段,您可以有一个名为date的日期类型字段,也可以有一名为date.keyword的关键字类型字段,还可以有一名称为code的关键字类型和一名称为code.intinteger类型字段,您还需要在映射中使用ignore_malformed设置,以便在发生映射错误时弹性不会拒绝整个文档,只是映射错误的字段。

请记住,当使用多字段时,每个映射都会有一个不同的字段,例如date是一个字段,date.keyword是另一个字段。这将增加存储使用率。

但是,这一切都不是自动完成的,它需要应用程序中的逻辑,弹性搜索不允许您更改字段的映射,如果您的应用程序需要,您需要在应用程序中实现一些可以使用弹性搜索限制的东西。

相关内容

最新更新