#elasticsearch #nest #elk
#elasticsearch #гнездо #elk
Вопрос:
У меня есть тип записи в elastic, который состоит из некоторых встроенных свойств, таких как
{
"_source":
{
"pipeline_version":1.7,
"agent":{
"hostname":"SFPWEW11616",
"id":"a1df2f4e-6dde-43fd-8af6-b3726124fdf7",
"type":"winlogbeat",
"ephemeral_id":"78be9770-dab9-4c56-a67e-b1a372a2f899",
"version":"7.5.1"
}
}, [...]
}
Я пытаюсь заставить свой POCO представлять сглаживание этого объекта. Согласно тому, что я нашел в документации, я попытался сделать что-то вроде
Friend Class ElasticEventLogEntry
<Nest.PropertyName("agent.hostname")>
Public Property AgentHostName As String
[...]
End Class
Но независимо от того, что я пытаюсь, значение всегда пустое. Я видел несколько других сообщений, использующих атрибут NestedAttribute, но из того, что я смог найти, это полезно только в том случае, если мы хотим также создавать вложенные объекты в нашей структуре POCO, что не мой случай. Чего мне не хватает?
Ответ №1:
Невозможно сделать то, что вы пытаетесь сделать, по крайней мере, без написания собственной сериализации JSON для вашего ElasticEventLogEntry
типа и подключения JsonNetSerializer
.
Лучшим подходом было бы моделировать ElasticEventLogEntry
по-другому
Public Class ElasticEventLogEntry
<DataMember(Name:="pipeline_version")>
Public Property PipelineVersion As String
Public Property Agent As Agent
End Class
Public Class Agent
Public Property Hostname As String
Public Property Id As String
Public Property Type As String
<DataMember(Name:="ephemeral_id")>
Public Property EphemeralId As String
Public Property Version As String
End Class
Тогда имя хоста агента будет десериализовано в .Agent.Hostname
Комментарии:
1. Хорошо, спасибо. К сожалению, это было то, чего я ожидал. Печально, что мы не можем использовать точечную нотацию в атрибуте propertyName.
2. Что странно в этом поведении, так это то, что если вы задаете propertyName с обозначением точки в свойстве, оно используется для запроса, но не для десериализации.
3. Допустимо, чтобы имена полей объектов в формате JSON содержали точку, поэтому
{"agent.hostname":"dot-hostname","agent":{"hostname":"agent-hostname"}
допустимо — как сериализатор должен обрабатывать это при десериализации? И если у POCOs есть атрибуты, содержащие точки, как сериализатор должен обрабатывать это при сериализации? Сериализатор использует имена свойств, как указано, включая точки.4. @RusaCam Но это атрибут, специфичный для Elastic, и Elastic плохо работает с именами файлов с точками, поэтому атрибут может «легко» применить это и выполнить правильный перевод для сериализатора за сценой.
5. Меня действительно пугает, что NEST не поддерживает это из коробки.