在我的querybuilder中添加多个(非硬编码)方面

本文关键字:编码 方面 querybuilder 我的 添加 | 更新日期: 2023-09-27 18:08:34

我对弹性搜索和弹性搜索API非常陌生,我在c#: PlainElastic.Net中使用。

我有一个简单的请求,但我坚持它:我怎么能在我的querybuilder中添加多个(不是硬编码)方面?

//code has been simplified 
//list of fields I want to be added in my facet part of the querybuilder
List<string> FacetFields = new List<string>{"field1", "field2", "fieldN"};
//qb is already instantiated with a simple ES query 
//I want now to add facets definition
qb.Facets(_facets =>
    FacetFields.ForEach(_ff => 
        _facets.Terms(t => t
           .FacetName("FacetsFor" + _ff)
           .Field(_ff)
        );
    });
);

不能编译,错误是:

无法将lambda表达式转换为委托类型' System.Func<PlainElastic.Net.Queries.Facets<MyType>,PlainElastic.Net.Queries.Facets<MyType>> ',如某些返回类型不能隐式转换为返回类型delegate

在我的querybuilder中添加多个(非硬编码)方面

我不是一个c#的家伙,但与我的Ruby代码相比,我认为你的东西是由内到外的。

目的是使最终的JSON看起来像
"facets" : {
  "facet_name1" : { "terms" : {"field" : "tags"} }
  "facet_name2" : { "terms" : {"field" : "user"} }
}

看看你的代码,它看起来像你的结果可能是,条款是坐在外面的每个子句与它里面的facet名称。如果这是代码实际在做的事情,那么这是不正确的。

如果您有办法查看查询后由库生成的JSON或elasticsearch的输出,那么您肯定能够看到ES接收到的查询是什么样子的,这在调试我自己的查询时是必不可少的。

在每个已命名的面中,您也可以添加额外的过滤,但是首先使用简单的情况,使用一个面,然后两个,然后是更复杂的过滤。

编译错误的原因是List<T>.ForEach()返回的是void,而qb.Facets()期望的是Facets<MyType>类型的结果。

所以你的代码应该是这样的:
List<string> FacetFields = new List<string>{"field1", "field2", "fieldN"};
qb.Facets(_facets => {
    FacetFields.ForEach(_ffield => 
        _facets.Terms(t => t
           .FacetName("FacetsFor" + _ffield)
           .Field(_ffield)
        )
    );
    // Return configured _facets as expected by qb.Facets
    return _facets;
});
// Get generated JSON
string jsonQuery = qb.BuildBeautified();