Search code examples
elasticsearchnest

Nest NamedFilters requires promise


I have simple elastic request:

var request4 =
                _client.Search<T>(s => s
                    .Aggregations(aggs =>
                        aggs.Filters("FacetedSearch",
                            f => f
                                .NamedFilters(g =>
                                    {
                                            var namedFilters = new NamedFiltersContainer();
                                            

                                            foreach (var facet in _facets)
                                        {
                                            namedFilters.Add(facet.Key,
                                                Query<T>.Terms(p => new Nest.TermsQuery
                                                    {Field = facet.Key, Terms = 
                                                            new[] {facet.Value}}));
                                        }

                                        return namedFilters;
                                    })

However, compiler requires Nest.IPromise<Nest.INamedFiltersContainer> I haven't found any constructor which could construct a promise of a given type. Is there any way to cast the NamedFiltersContainer into a prmosie ?


Solution

  • You can use the parameters passed to the delegates to compose the named filters

    var client = new ElasticClient();
    
    var _facets = new Dictionary<string, string>
    {
        ["foo"] = "bar",
        ["baz"] = "quux"
    };
    
    var request4 = client.Search<object>(s => s
        .Aggregations(aggs =>
            aggs.Filters("FacetedSearch", f => f
                .NamedFilters(g =>
                {
                    foreach (var facet in _facets)
                    {
                        g.Filter(facet.Key, Query<object>.Terms(p => p
                             .Field(facet.Key)
                             .Terms(new[] { facet.Value })
                            )
                        );
                    }
    
                    return g;
                })
            )
        )
    );
    

    yields

    {
      "aggs": {
        "FacetedSearch": {
          "filters": {
            "filters": {
              "foo": {
                "terms": {
                  "foo": ["bar"]
                }
              },
              "baz": {
                "terms": {
                  "baz": ["quux"]
                }
              }
            }
          }
        }
      }
    }