elasticsearch 未知设置 index.include_type_name

elasticsearch unknown setting index.include_type_name

我遇到了很奇怪的情况,我需要在 elasticsearch 中创建包含无类型字段的索引。我有一个 rails 应用程序,它每秒向我的 elasticsearch 发送任何数据。关于我的体系结构,我不得不说我在 docker 服务器上使用 elastic-stack,并使用套接字将数据发送到 elk,所有这些都是最新版本。

在我的 rails 应用程序中,用户可以为每个字段选择数据类型,但是当用户想要在创建一个字段后立即更改其数据类型时,问题就会发生,logstash return 这个错误

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\

我发现致命的队列字母插件可以在我的服务器中保存错误的输入,之后我想如果我可以在没有任何类型的情况下索引文档,问题就解决了所以我开始谷歌搜索并找到 Removal of mapping types in elasticsearch documents 并且我按照教程中描述的说明进行操作我收到以下错误:

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

即使我在发送到 elastic 的请求中放了“include_type_name”,但我有最新版本的 elastic。

我认为编辑默认的 elasticsearch 模板但注意更改可能会有所帮助。你能帮我看看我该怎么做吗?

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

例如,如果一个字段被映射为数字字段,如integer,而用户想在该字段中索引一个字符串值,elasticsearch将return一个映射错误。

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

None 由 elastic 自动完成,你需要在你的应用程序中处理这个,你可以捕获错误并实现一些逻辑来使用新映射创建新索引,但是这个当查询范围包含具有不同映射的相同字段的索引时,也可能导致其他问题,例如集群中的索引过多和查询错误。

Elasticsearch 的一项功能可以在某种程度上帮助您 runtime fields,对于运行时字段,您可以使用不同的映射来查询具有特定映射的字段。

例如,如果您有一个包含日期值的字段,但被错误地映射为关键字或文本字段,您可以使用运行时字段来查询它,因为它是一个日期字段。

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

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

使用 multi-fields 你可以有一个名为 date 的日期类型的字段和一个名为 date.keyword 的关键字类型的字段,你还可以有一个字段名称 code 使用关键字类型和字段名称 code.int 使用 integer 类型,您还需要在映射中使用 ignore_malformed 设置,以便弹性不会拒绝整个文档映射错误的情况,只是映射错误的字段。

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

但同样,none这是自动完成的,它需要你的应用程序中的逻辑,elasticsearch 不允许你更改字段的映射,如果你的应用程序需要这个,你将需要实现应用程序中可以解决 elasticsearch 限制的内容。