1

我对 Elastic Search 和我在 C# 中使用的 Elastic Search API 很陌生:PlainElastic.Net

我有一个简单的请求,但我坚持下去:如何在我的查询构建器中添加多个(非硬编码)方面?

//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>>”,因为块的某些返回类型不能隐式转换为返回类型委托

4

2 回答 2

0

我不是 C# 的人,但与我的 Ruby 代码相比,我认为你的东西是由内而外的。

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

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

查看您的代码,您的结果可能是术语位于每个子句之外,其中包含方面名称。如果那是代码实际在做的事情,那是不正确的。

如果您有办法查看库生成的 JSON 或查询后来自 elasticsearch 的输出,那么您肯定能够看到 ES 接收到的查询是什么样的,我认为这对于调试我自己的查询至关重要。

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

于 2013-04-12T13:48:23.850 回答
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();
于 2013-04-23T16:26:07.777 回答