بدأت المحادثة المستمرة هنا: https://discuss.elastic.co/t/coerce-object-to-string/56748/3
وصف المشكلة بما في ذلك السلوك المتوقع مقابل السلوك الفعلي :
هل ترغب في أن تكون قادرًا على التعامل مع حقل كائن باعتباره سلسلة في ضوء التعيين التالي:
"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 مهرب.