我对Elastic Search以及我在C#中使用的弹性搜索API非常陌生:PlainElastic.Net。
我有一个简单的请求,但我坚持使用它:如何在我的querybuiler中添加多个(不是硬编码的)facet?
//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表达式转换为委托类型 &#39;
System.Func<PlainElastic.Net.Queries.Facets<MyType>,PlainElastic.Net.Queries.Facets<MyType>>
&#39;,作为一些返回类型 块的内容不可隐式转换为返回类型委托
答案 0 :(得分:0)
我不是C#家伙,但与我的Ruby代码相比,我认为你有内心的东西。
目的是让最终的JSON看起来像
"facets" : {
"facet_name1" : { "terms" : {"field" : "tags"} }
"facet_name2" : { "terms" : {"field" : "user"} }
}
查看您的代码,看起来您的结果可能是条款位于每个子句之外,其中包含构面名称。如果那就是代码实际上正在做的那样,这是不正确的。
如果您有办法在查询后查看库生成的JSON或者弹性搜索的输出,那么您肯定能够看到ES收到的查询内容,我认为这对我自己的调试很重要查询。
在每个命名面中,你也可以添加额外的过滤,但是首先使用简单的情况,一个方面,然后两个,然后是更复杂的过滤。
答案 1 :(得分:0)
此编译错误的原因是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();