継続的な会話はここから始まりました: https :
予想される動作と実際の動作を含む問題の説明:
次のマッピングを指定して、オブジェクトフィールドを文字列として処理できるようにしたいと考えています。
"properties": {
"severity": {
"index": "not_analyzed",
"type": "string"
},
"metadata": {
"type": "string"
"coerce": true
}
}
次のドキュメントのインデックスを作成します。
{
"severity": "ERROR",
"metadata": {
"someKey": "someValue",
"someKey": {
"some nested key": "some nested value"
}
}
}
ドキュメントを検索可能な文字列としてmetadata
下に保存する必要があります。
現在、文字列に何かを強制することはできません。
現在、上記のマッピングは有効とは見なされていません。 ESは次のように爆発します:
MapperParsingException[Failed to parse mapping [event]: Mapping definition for [metadata] has unsupported parameters: [coerce : true]]; nested: MapperParsingException[Mapping definition for [metadata] has unsupported parameters: [coerce : true]];
at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$1.execute(MetaDataCreateIndexService.java:332)
at org.elasticsearch.cluster.ClusterStateUpdateTask.execute(ClusterStateUpdateTask.java:45)
at org.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468)
at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
Caused by: MapperParsingException[Mapping definition for [metadata] has unsupported parameters: [coerce : true]]
at org.elasticsearch.index.mapper.DocumentMapperParser.checkNoRemainingFields(DocumentMapperParser.java:171)
at org.elasticsearch.index.mapper.DocumentMapperParser.checkNoRemainingFields(DocumentMapperParser.java:165)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:307)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parse(ObjectMapper.java:193)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:305)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218)
at org.elasticsearch.index.mapper.object.RootObjectMapper$TypeParser.parse(RootObjectMapper.java:139)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:118)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:99)
at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:498)
at org.elasticsearch.index.mapper.MapperService.merge(MapperService.java:288)
at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$1.execute(MetaDataCreateIndexService.java:329)
私はこの機能のファンではありません。 文字列フィールドでオブジェクトを文字列に自動的に強制変換することもできますが、これは私の意見ではかなり厄介です。elasticsearchがマッピングに準拠していないドキュメントを拒否しないとユーザーが不満を言っていることは確かに想像できます。 または、数値が文字列を自動的に解析する必要があるなど、この動作を有効にするためのマッピングオプションが必要になりますが、マッピングに関するオプションがすでに多すぎるため、どちらも好きではありません。 エスケープされたjsonを含む文字列を提供するためにクライアントに依存したいと思います。
これはhttps://github.com/elastic/elasticsearch/issues/17918の複製であり、これを行うことに反対しました。
最も参考になるコメント
私はこの機能のファンではありません。 文字列フィールドでオブジェクトを文字列に自動的に強制変換することもできますが、これは私の意見ではかなり厄介です。elasticsearchがマッピングに準拠していないドキュメントを拒否しないとユーザーが不満を言っていることは確かに想像できます。 または、数値が文字列を自動的に解析する必要があるなど、この動作を有効にするためのマッピングオプションが必要になりますが、マッピングに関するオプションがすでに多すぎるため、どちらも好きではありません。 エスケープされたjsonを含む文字列を提供するためにクライアントに依存したいと思います。