Как искать во вложенном объекте несколько значений в одном поле в Elasticsearch с помощью библиотеки NEST? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть вложенные документы, например;

public sealed class CampaignIndexModel : ElasticEntity<Guid>
    {
        public Guid StoreId { get; set; }
        public string Slug { get; set; }
        public string SlugKey { get; set; }
        public string Title { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
        public string Condition { get; set; }
        public string PreviewImageUrl { get; set; }
        public DateTime? StartTime { get; set; }
        public DateTime? EndTime { get; set; }
        public bool IsPublished { get; set; }
        public DateTime CreatedOnUtc { get; set; }
        
        [Nested]
        public List<BadgeIndexModel> Badges { get; set; } 
    }



 public class BadgeIndexModel
    {
        public string Code { get; set; }
        public string Name { get; set; }
    }

Я хотел бы запросить во вложенном объекте несколько значений. Например, мне нужно запросить, какие свойства кода включены: «AD», «NEW». Все документы должны иметь бейдж, а свойства их кода должны быть «AD» и «NEW». Свойства кода могут быть динамическими. На самом деле я хотел бы найти список строк в свойстве кода вложенного объекта.

Обратите внимание, что классы автоматически сопоставляются при создании индексов.

Надеюсь, вопрос ясен, понятен.

Спасибо.

ОБНОВЛЕНИЕ

Насколько я изучал документацию Elasticsearch, как показано ниже, результат запроса возвращает точно указанные коды значков.

q.Bool(b=>b
          .Must(x=>x.
             Nested(n=>n
                .Path(p=>p.Badges)
                    .Query(qq=>qq
                         .Term(t=>t                                    
                            .Field(f=>f.Badges.First().Code.Suffix("keyword"))
                                    .Value(badge))))))

Затем ответ, помеченный как правильный, возвращает документы, содержащие коды значков

1 Ответ

1 голос
/ 07 августа 2020

Я знаю, что вы немного не писали вопрос. Но здесь вы go - вы можете сделать это, создав вложенный запрос, в котором вы можете фильтровать свой список и передавать его в свой метод поиска. Ниже метод показывает, как это можно сделать. Это принимает список строк, которые вы хотите использовать в качестве значений для кодов.

private static QueryContainer BuildNestedQuery(List<string> badgeCodes)
{
    // badgeCodes is your list of strings that you want to filter on
    return new QueryContainerDescriptor<CampaignIndexModel>()
        .Nested(n =>
            n.Path(c => c.Badges)
             .Query(q => q
                .Terms(t => t
                    .Field(f => f.Badges.FirstOrDefault().Code)
                    .Terms(badgeCodes.ToArray())
                )
             )
        )   
}

Этот QueryContainer может быть далее передан методу Search клиента NEST, как показано ниже. Однако имейте в виду, что могут быть небольшие изменения в способе запуска клиентского метода поиска в зависимости от того, как вы это делаете, но подключение его к методу поиска остается более или менее таким же, как показано ниже.

// replace T with type of your choice
// client is a reference to NEST client
var result = client.Search<T>(    
    .From(0)
    .Size(20)
    .Query(q => BuildNestedQuery(badgeCodesList))
    // other methods that you want to chain go here
)
...