Elasticsearch NEST v.5.0.1按GeoDistance错误排序



我在WebApi项目中使用NEST按GeoDistance排序时遇到了一个问题。我有:

  • 服务器与Elasticsearch v.1.1(工作良好)
  • 安装了NEST v5.0.1的简单.NET Web Api应用程序(基本CRUD和搜索操作运行良好)

昨天我决定按GeoDistance进行排序,但所有可能的解决方案都让我在搜索/排序请求中遇到了这个例外:

上的低级别调用不成功生成的NEST响应无效POST:/activities/activity/_sarch此API调用的审核跟踪:

[1] 错误响应:节点:http://MY_SERVER_IP:9200/拍摄时间:00:00:00.319217服务器错误:服务器错误:400类型:search_phase_execution_exception原因:"所有碎片失败"原因:"类型:

非法_参数_异常原因:

"无法为基于地理距离的排序找到[geoposition]的映射器">

OriginalException:System.Net.WebException:远程服务器返回错误:(400)错误请求。在位于的System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction,Action1 endAction, Task1 promise,布尔值要求同步)---从上一个引发异常的位置开始的堆栈结尾跟踪--在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
位于中的Elasticsearch.Net.HttpConnection.d_9`1.MoveNext()C: \Users\russ\source\aelasticsearch-net-5.x\src\Aelasticsearch.net\Connection\HttpConnection.cs:line199

请求:强制将其设置在响应上。>

回复:ConnectionSettings以强制在响应上设置它。>

我的型号:

[ElasticsearchType(IdProperty = nameof(Id), Name = "activity")]
public class Activity
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "title")]
public string Title { get; set; }
[JsonProperty(PropertyName = "description")]
public string Description { get; set; }
[GeoPoint(Name = "geoposition")]
public GeoLocation Geoposition { get; set; }
[Date(Name = "date_published")]
public DateTime DatePublished { get; set; }
}

我的NEST客户端初始化:

var settings = new ConnectionSettings(_node)
.DefaultIndex(_defaultIndex)
.MapDefaultTypeIndices(m => m.Add(typeof(Activity), _defaultIndex));
ElasticClient _client = new ElasticClient(settings);

我尝试了两种不同的映射方法,因为我真的不知道如何在新的NEST客户端中做到这一点:

  1. _client.Map<Activity>(m => m.AutoMap().Properties(p => p.GeoPoint(geo => geo.Name(n => n.Geoposition))));
  2. _client.Map<Activity>(m => m.Properties(p => p.GeoPoint(geo => geo.Name(n => n.Geoposition))));

我的当前查询(给我上面描述的错误):

var result = await _client.SearchAsync<Activity>(s => s.Index(_defaultIndex)
//I removed search query to analyze only sorting problem
.Sort(
ss =>
ss.Descending(p => p.DatePublished)
.GeoDistance(
g => g
.Field(p => p.Geoposition)
.DistanceType(GeoDistanceType.Plane)
.Unit(DistanceUnit.Kilometers)
.Order(SortOrder.Ascending)
.PinTo(pin))));

我从elasticsearch服务器得到的映射响应:

{
"activities": {
"mappings": {
"activity": {
"properties": {
"date_published": {
"type": "date"
},
"description": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"geoposition": {
"properties": {
"lat": {
"type": "float"
},
"lon": {
"type": "float"
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}

有人能帮我解决这个问题吗?我不明白为什么它不起作用,为什么映射不起作用。

到目前为止,我使用stackerflow得到的主要规则是:这个问题是我自己造成的,所以解决方案已经在我心中了。搜索它。

如果您曾经面临同样的错误检查,如果您有一个索引创建代码。我没有。所以我的索引和它的映射是在插入第一个文档时创建的(通过测试发现)。

答案是这个缺失的字符串:

_client.CreateIndex(_defaultIndex, descriptor => descriptor.Mappings(ms => ms.Map<Activity>(m => m.AutoMap())));

在弹性客户端初始化之后

ElasticClient _client = new ElasticClient(settings);

最新更新