查询中的外包部分
Outsource parts in queries
假设我在 C# 中使用 NEST 编写了以下代码:
private ISearchResponse<Country> GetFilteredResultsByIds(ElasticClient client,
Query query)
{
return client.Search<Country>(s => s
.From(0)
.Size(10)
.Query(q => q
.Nested(n => n
.Path(p => p.Customer)
.Query(q => q
.Term(t => t
.Field(f => f.Customer.CustomerId).Value(query.CustomerId)))
) && q
.Nested(n => n
.Path(p => p.Person)
.Query(q => q
.Term(t => t
.Field(f => f.Person.ServiceId).Value(query.ServiceId))))));
}
是否可以将部分搜索查询外包给外部 classes/parameters?例如 Customer 和 Person 部分,以便能够在另一个查询中重用它。
您可以将这些部分提取到静态 class 并按如下方式使用
client.Search<Country>(s => s
.From(0)
.Size(10)
.Query(q => q.SearchCustomerId(customerId) && q.SearchServiceId(serviceId)));
Class 已提取部分
public static class Helpers
{
public static QueryContainer SearchServiceId(this QueryContainerDescriptor<Country> container, string serviceId)
{
return container
.Nested(n => n
.Path(p => p.Person)
.Query(q => q
.Term(t => t
.Field(f => f.Person.First().ServiceId).Value(serviceId))));
}
public static QueryContainer SearchCustomerId(this QueryContainerDescriptor<Country> container, string customerId)
{
return container
.Nested(n => n
.Path(p => p.Customer)
.Query(q => q
.Term(t => t
.Field(f => f.Customer.First().CustomerId).Value(customerId))));
}
}
假设我在 C# 中使用 NEST 编写了以下代码:
private ISearchResponse<Country> GetFilteredResultsByIds(ElasticClient client,
Query query)
{
return client.Search<Country>(s => s
.From(0)
.Size(10)
.Query(q => q
.Nested(n => n
.Path(p => p.Customer)
.Query(q => q
.Term(t => t
.Field(f => f.Customer.CustomerId).Value(query.CustomerId)))
) && q
.Nested(n => n
.Path(p => p.Person)
.Query(q => q
.Term(t => t
.Field(f => f.Person.ServiceId).Value(query.ServiceId))))));
}
是否可以将部分搜索查询外包给外部 classes/parameters?例如 Customer 和 Person 部分,以便能够在另一个查询中重用它。
您可以将这些部分提取到静态 class 并按如下方式使用
client.Search<Country>(s => s
.From(0)
.Size(10)
.Query(q => q.SearchCustomerId(customerId) && q.SearchServiceId(serviceId)));
Class 已提取部分
public static class Helpers
{
public static QueryContainer SearchServiceId(this QueryContainerDescriptor<Country> container, string serviceId)
{
return container
.Nested(n => n
.Path(p => p.Person)
.Query(q => q
.Term(t => t
.Field(f => f.Person.First().ServiceId).Value(serviceId))));
}
public static QueryContainer SearchCustomerId(this QueryContainerDescriptor<Country> container, string customerId)
{
return container
.Nested(n => n
.Path(p => p.Customer)
.Query(q => q
.Term(t => t
.Field(f => f.Customer.First().CustomerId).Value(customerId))));
}
}