Сопоставление ключевых слов для поддокумента в эластичном NEST

Теперь я изучаю клиент Nest 6.x для elasticsearch. Я хочу использовать поиск по терминам в поддокументах. У меня есть эти классы:

public class BaseTest
    {
        public string Id { get; set; }

        public SubBase SubDocument { get; set; }

        public Guid TypeId { get; set; }

        public string BaseTitel { get; set; }
    }
public class SubBase
    {
        public int Id { get; set; }
        public Guid IdGuid { get; set; }
        public string Titel { get; set; }
    }

и используйте это сопоставление для создания индекса:

.Mappings(mp => mp
                    .Map<BaseTest>(m => m
                        .Properties(pr => pr
                            .Keyword(kw => kw
                                .Name(nm => nm.BaseTitel)))
                        .Properties(pr => pr
                            .Keyword(kw => kw
                                .Name(nm => nm.TypeId)))
                        .Properties(pr => pr
                            .Keyword(kw => kw
                                .Name(nm => nm.SubDocument.Titel)))
                        .Properties(pr => pr
                            .Keyword(kw => kw
                                .Name(nm => nm.SubDocument.IdGuid)
                            ))))

когда я пытаюсь найти значения GUID (или строки в формате GUID, если я сохраняю SubBase.Titel как Guid для тестов) в BaseTest, это работает, но не в SubBase. Для поиска я использую этот запрос:

.Query(q => q
 .ConstantScore(cs => cs
  .Filter(f => f
   .Term(t => t
    .SubDocument.Titel, "5d511b8a-37c7-40c1-a5c3-4de13e16e379"))))

Обновить
Новое сопоставление:

.Mappings(mp => mp
                    .Map<BaseTest>(m => m
                        .Properties(pr => pr
                            .Keyword(kw => kw
                                .Name(nm => nm.BaseTitel)
                                .Name(nm => nm.TypeId)
                            )
                            .Object<SubBase>(o => o
                                .Name(n => n.SubDocument)
                                .Properties(p => p
                                    .Keyword(k => k
                                        .Name(n => n.Titel)
                                        .Name(n => n.IdGuid)))))))

Теперь я могу найти свойства Guid, но не свойства со строкой типа и значением типа «5d511b8a-37c7-40c1-a5c3-4de13e16e379».


person Dev    schedule 20.04.2018    source источник
comment
Ваше сопоставление неверно. Вам нужен только один вызов .Properties(), а затем сопоставьте все поля (.Keyword(), .Text() и т. д.) внутри него. Некоторые примеры см. в документации по сопоставлению: elastic.co/guide/en/elasticsearch/client/net-api/current/   -  person Russ Cam    schedule 20.04.2018
comment
@RussCam спасибо, теперь я могу найти свойства Guid. но если это свойство имеет строковый тип в формате Guid, оно не будет найдено. Что я должен делать?   -  person Dev    schedule 20.04.2018
comment
› свойство имеет строковый тип в формате Guid — я не понимаю, что вы здесь имеете в виду. Можете ли вы уточнить? System.Guid сериализуется в string   -  person Russ Cam    schedule 20.04.2018
comment
SubBase.Titel = 5d511b8a-37c7-40c1-a5c3-4de13e16e379   -  person Dev    schedule 20.04.2018
comment
Вы должны отобразить SubBase как тип данных object. Если все свойства string и Guid должны отображаться как keyword, вы можете применить посетителя для установки этого соглашения: elastic.co/guide/en/elasticsearch/client/net-api/current/   -  person Russ Cam    schedule 20.04.2018
comment
ваше сопоставление все еще неверно; вызовы .Name(...) внутри .Keyword() должны быть внутри их собственного вызова .Keyword(). По сути, все внутри одного вызова .Keyword() является отображением для одного поля/свойства.   -  person Russ Cam    schedule 23.04.2018
comment
Спасибо. :-).   -  person Dev    schedule 23.04.2018


Ответы (1)


Спасибо, Расс Кэм.

.Mappings(mp => mp
               .Map<BaseTest>(m => m
                 .Properties(pr => pr
                   .Keyword(kw => kw
                     .Name(nm => nm.BaseTitel))
                   .Keyword(kw => kw
                     .Name(nm => nm.TypeId))
                   .Object<SubBase>(o => o
                     .Name(n => n.SubDocument)
                       .Properties(p => p
                         .Keyword(k => k
                           .Name(n => n.Titel))
                         .Keyword(k => k
                           .Name(n => n.IdGuid)))))))
person Dev    schedule 23.04.2018