【问题标题】:C# Elasticsearch NEST cannot convert lambda expressionC# Elasticsearch NEST 无法转换 lambda 表达式
【发布时间】:2015-07-02 23:30:35
【问题描述】:

我遇到了与ElasticSearch NEST Search 此处描述(但未回答)完全相同的问题

我用:

  1. .NET Framework 4.5;

  2. ASP.NET MVC 5;

  3. Elasticsearch 1.6.0(在服务器上);

  4. Elasticsearch.NET 1.6.1

  5. NEST 1.6.1

我有一个 MVC 控制器,它有两个动作:

  1. 索引 - 包含 HTML UI 表单

  2. 搜索 - 包含 Elasticsearch.NET 客户端和查询。

    public ActionResult Search(SearchCreteria sc)
    {
      Settings settings = new Settings();
      Client client = new Client(settings);
      ElasticsearchClient esClient = client.Get();
    
      var test = esClient.Search<Contract>(body => body.Query(query => query.QueryString(qs => qs.Query("test"))));
    
      return View(test);
    }
    

上面代码中的整个 "body => body.Query(query => query.QueryString(qs => qs.Query("test")))" lambda 表达式带有波浪形的红色下划线带有以下工具提示:

(参数)?身体

错误:

无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型

我用谷歌搜索了这个问题,发现在 99% 的情况下人们忘记了包含一个程序集,通常是 System.Linq

嗯.. 我肯定没有忘记添加那个,但我可能必须包含一个 NEST 特定的程序集或类似的东西(我确信这不是真的,除了 NEST 本身),所以我决定添加我认为可能有点相关的所有内容,我最终得到了这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Web.Mvc;
using WebUI.Models.Concrete;

using Domain.Concrete.Entities;
using Domain.Concrete.Connectivity.Elastic;
using Domain.Concrete.Processors.Elastic;

using Elasticsearch;
using Elasticsearch.Net;
using Elasticsearch.Net.Connection.Configuration;
using Elasticsearch.Net.Connection.RequestState;
using Elasticsearch.Net.Connection.Security;
using Elasticsearch.Net.ConnectionPool;
using Elasticsearch.Net.Exceptions;
using Elasticsearch.Net.Providers;
using Elasticsearch.Net.Serialization;

using Nest;
using Nest.Domain;
using Nest.DSL.Descriptors;
using Nest.DSL.Query;
using Nest.DSL.Query.Behaviour;
using Nest.DSL.Visitor;
using Nest.Resolvers.Converters.Aggregations;
using Nest.Resolvers.Converters.Filters;
using Nest.Resolvers.Converters.Queries;
using Nest.Resolvers.Writers;

它没有像预期的那样有帮助,但值得一试。所以现在,我不确定问题出在哪里,我们将不胜感激。

【问题讨论】:

  • 您的 lambda 未知。尝试将 lambda 转换为 Func。无论身体是什么类型。 (Func&lt;typeofbody,object&gt;)(body =&gt; {...})... 而且你不需要参考任何东西来解决这个问题。因为它无关紧要。看here
  • (参数)?身体。身体的类型是什么?
  • 我无法重现您的问题。尝试添加 而不是 Contract 并通过 .Type("yourType") 或使用 .AllTypes() 在搜索中指定类型 后者不会特定于合同,但可能会阐明实际问题
  • 丹尼尔。那没用。
  • 恐怕我无法重现您的问题。

标签: c# elasticsearch lambda delegates nest


【解决方案1】:

cmets 中已经提供了关于问题本身的答案,但将其添加给未来的 googlers。

Elasticsearch.NET

是一个准系统的低级ElasticsearchClient 客户端,它只接受字符串、匿名/动态对象或byte[]。同样,它也没有响应的返回类型。如此配置时,此客户端支持连接池和节点故障转移。此客户端的 80% 是自动生成的。

此客户端仅在您与 Elasticsearch 进行集成时才有用,该集成仅存在少数调用,并且您不想引入对例如 Json.NET 的依赖。仅使用它的库的示例是 Serilog.Sinks.Elasticsearch

高级ElasticClient 客户端,具有所有请求和响应的99.9% 的类型。 99/100 次这是您要使用的客户端。 NEST 在后台使用 Elasticsearch.NET 将请求分派到正确的 elasticsearch API 端点,并使用相同的连接池和故障转移基础设施。

【讨论】:

  • 本质上是正确的。但是,我想指出有关 ElasticClient 的信息非常有限。事实上,在 Rob(Rob 7 月 3 日 8:15)告诉我之前,我并不知道它存在。仅当您搜索 ElasticClient 时,Google 才会显示此页面 nest.azurewebsites.net/nest/quick-start.html,并且该信息在该页面的 2 段中。如果你错过了它,你就有麻烦了。所以 - 是的,正确的答案是始终使用 ElasticClient,而不是 ElasticserachClient。
  • 感谢 Alex 的反馈,我们将更新快速入门以明确提及这一点。
【解决方案2】:

我可以给你一个如何使用 NEST 的例子。

var node = new Uri(elasticSearchURI);
var connectionPool = new SniffingConnectionPool(new[] { node });

var config = new ConnectionSettings(connectionPool)
                        .SniffOnConnectionFault(false)
                        .SniffOnStartup(false)
                        .SetTimeout(600000)
                        .DisablePing();

_Instance = new ElasticClient(config);

var result = _Instance.Search<Location>(s => s
              .Index("index")
              .Type("type")
              .Query(q =>
              {
                QueryContainer locationQuery = null;
                locationQuery |= q.QueryString(qs=>qs.OnFields(f => f.RecordValue).Query(term).MinimumShouldMatchPercentage(100));
                return locationQuery;
              })
             .Take(1)
             .Sort(sort => sort.OnField("_score").Descending())
           );

或者如果您不想使用 QueryContainers

   var result = _Instance.Search<Location>(s => s
                  .Index("index")
                  .Type("type")
                  .Query(q => q.QueryString(qs=>qs.OnFields(f => f.RecordValue).Query(term).MinimumShouldMatchPercentage(100))
                  .Take(10)
                  .Sort(sort => sort.OnField("_score").Descending())
               );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多