在我的querybuiler中添加多个(非硬编码)facet

时间:2013-04-11 14:40:31

标签: c# elasticsearch faceted-search plainelastic.net

我对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;,作为一些返回类型   块的内容不可隐式转换为返回类型委托

2 个答案:

答案 0 :(得分:0)

我不是C#家伙,但与我的Ruby代码相比,我认为你有内心的东西。

目的是让最终的JSON看起来像

"facets" : {
  "facet_name1" : { "terms" : {"field" : "tags"} }
  "facet_name2" : { "terms" : {"field" : "user"} }
}

查看您的代码,看起来您的结果可能是条款位于每个子句之外,其中包含构面名称。如果那就是代码实际上正在做的那样,这是不正确的。

如果您有办法在查询后查看库生成的JSON或者弹性搜索的输出,那么您肯定能够看到ES收到的查询内容,我认为这对我自己的调试很重要查询。

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

答案 1 :(得分:0)

此编译错误的原因是List<T>.ForEach()返回voidqb.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();