Search code examples
elasticsearchnest

How can i construct a NEST query with optional parameters?


I'm using the NEST .NET client (6.3.1), and trying to compose a search query that is based on a number of (optional) parameters.

Here's what i've got so far:

var searchResponse = await _client.SearchAsync<Listing>(s => s
                .Query(qq =>
                {
                    var filters = new List<QueryContainer>();

                    if (filter.CategoryType.HasValue)
                    {
                        filters.Add(qq.Term(p => p.CategoryType, filter.CategoryType.Value));
                    }

                    if (filter.StatusType.HasValue)
                    {
                        filters.Add(qq.Term(p => p.StatusType, filter.StatusType.Value));
                    }

                    if (!string.IsNullOrWhiteSpace(filter.Suburb))
                    {
                        filters.Add(qq.Term(p => p.Suburb, filter.Suburb));
                    }

                    return ?????; // what do i do her?
                })
            );

filter is an object with a bunch of nullable properties. So, whatever has a value i want to add as a match query.

So, to achieve that i'm trying to build up a list of QueryContainer's (not sure that's the right way), but struggling to figure out how to return that as a list of AND predicates.

Any ideas?

Thanks


Solution

  • Ended up doing it by using the object initialisez method, instead of the Fluent DSL"

    var searchRequest = new SearchRequest<Listing>
    {
       Query = queries
    }
    

    queries is a List<QueryContainer>, which i just build up, like this:

    queries.Add(new MatchQuery
    {
       Field = "CategoryType",
       Query = filter.CategoryType
    }
    

    I feel like there's a better way, and i don't like how i have to hardcode the 'Field' to a string... but it works. Hopefully someone shows me a better way!