查询中的外包部分

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