在我的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
我不是一个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();