Elasticsearch NEST-запрос вложенного объекта - PullRequest
0 голосов
/ 26 апреля 2020

Я хотел бы получить вложенный объект из документов в моем индексе под названием «userprofiles».

Моя модель UserProfile:

publi c class UserProfileModel

{
    public string FullName { get; set; }
    public string Oid { get; set; }
    public string Upn { get; set; }
    public List<SsoLink> FavoriteSsoLinks { get; set; } = new List<SsoLink>();
}

Моя модель SsoLink:

public class SsoLink
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public string Owner { get; set; }
}

Создание индекса:

PUT userprofiles
{
    "mappings" : {
        "properties" : {
            "FavoriteSsoLinks" : {
                "type" : "object"
            }
        }
    }
}

Мой запрос:

var searchResponse = _client.Search<UserProfileModel>(s => s
                .Index(_profileIndex)
                .Query(q=>q
                    .Term(t => t.Field(t => t.Oid).Value(oid)
                        )
                    )
                );

Сейчас он возвращает документы, но объект favitelinks пуст, но я вижу объекты, перечисленные в Kibana. Я, должно быть, упускаю что-то очевидное, но не могу понять это.

Вот пример моих данных:

enter image description here

1 Ответ

1 голос
/ 29 апреля 2020

В примере создания индекса в качестве свойства используется "FavoriteSsoLinks", но на снимке экрана Kibana используется "favoriteSsoLinks", начиная со строчной буквы f - что правильно? Я подозреваю, что проблема может быть в регистре свойств, но в индексе нужно будет увидеть сопоставление, чтобы узнать, верно ли это.

Клиент 7.x строго относится к регистру имен свойств в JSON, и по умолчанию использует имена свойств camelcase, чтобы соответствовать именам свойств POCO. Например, по умолчанию

  • "favoriteSsoLinks" в JSON будет совпадением для FavoriteSsoLinks POCO свойство
  • "FavoriteSsoLinks" в JSON не будет совпадением для FavoriteSsoLinks POCO-свойства

Это поведение можно изменить с помощью DefaultFieldNameInferrer(Func<string, string>) на ConnectionSettings для всех свойств или для каждого свойства отдельно использование атрибутов для свойств, таких как DataMemberAttribute или PropertyNameAttribute, или использование DefaultMappingFor<T>, где T - это тип POCO.

...