如何使用 NEST 库在嵌套对象中搜索 Elasticsearch 中同一字段的多个值?

How to search in nested object for multiple values on same field in Elasticsearch with NEST Library?

我有嵌套文档,例如;

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 文档,如下所示,查询结果 returns 与给定的徽章代码完全匹配。

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))))))

然后,标记为正确的答案,returns 个包含徽章代码的文档

我知道您发布问题已经有一段时间了。但是现在你开始了——你可以通过创建一个嵌套查询来做到这一点,你可以在其中过滤你的列表并将它传递给你的搜索方法。下面的方法显示了如何做到这一点。这会将您要用作代码值的字符串列表。

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 可以进一步传递给 NEST 客户端的 Search 方法,如下所示。但是,请记住,根据您的操作方式,触发客户端搜索方法的方式可能会略有变化,但将其挂接到搜索方法与下面所示大致相同。

// 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
)