C# Elasticsearch NEST 无法转换 lambda 表达式

C# Elasticsearch NEST cannot convert lambda expression

我 运行 遇到与此处描述(但未回答)完全相同的问题 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 表达式带有波浪形的红色下划线和以下工具提示:

(Parameter) ? body

Error:

Cannot convert lambda expression to type 'object' because it is not a delegate type

我用谷歌搜索了这个问题,发现在 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;

它没有达到预期的效果,但值得一试。所以现在,我不确定问题出在哪里,我们将不胜感激。

答案已经在问题本身的评论中提供,但为未来的谷歌员工添加这个。

Elasticsearch.NET

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

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

巢穴

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

我可以给你一个如何使用 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())
               );