如何使用 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
)
我有嵌套文档,例如;
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
)