C# Elasticsearch NEST 无法转换 lambda 表达式
C# Elasticsearch NEST cannot convert lambda expression
我 运行 遇到与此处描述(但未回答)完全相同的问题 ElasticSearch NEST Search
我使用:
.NET Framework 4.5;
ASP.NET MVC 5;
Elasticsearch 1.6.0(在服务器上);
Elasticsearch.NET 1.6.1
NEST 1.6.1
我有一个 MVC 控制器,它有两个动作:
索引 - 其中包含 HTML UI 形式
搜索 - 包含 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())
);
我 运行 遇到与此处描述(但未回答)完全相同的问题 ElasticSearch NEST Search
我使用:
.NET Framework 4.5;
ASP.NET MVC 5;
Elasticsearch 1.6.0(在服务器上);
Elasticsearch.NET 1.6.1
NEST 1.6.1
我有一个 MVC 控制器,它有两个动作:
索引 - 其中包含 HTML UI 形式
搜索 - 包含 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())
);