Не удается получить Nest.propertyName для определения вложенности

#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 не поддерживает это из коробки.