我在Web Api项目中使用NEST进行GeoDistance排序时遇到了问题。 我有:
昨天我决定用GeoDistance实现排序,但是我在搜索/排序请求中找到了所有可能的解决方案:
无效的低级别呼叫构建的无效NEST响应 POST:/ activities / activity / _search 此API调用的审计跟踪:
[1] BadResponse:Node:http://MY_SERVER_IP:9200/ Took:00:00:00.3129217 ServerError:ServerError:400Type:search_phase_execution_exception原因:“所有分片都失败”CausedBy:“Type:
illegal_argument_exception原因:
“找不到基于地理距离排序的”地理位置“的映射器”“
OriginalException:System.Net.WebException:远程服务器返回错误:(400)错误请求。在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
请求:
在 System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func
2 endFunction,Action1 endAction, Task
1 promise,Boolean requiresSynchronization) ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在Elasticsearch.Net.HttpConnection.d__9`1.MoveNext()中 C:\ Users \用户拉斯\源\ elasticsearch净5.x的\ SRC \ Elasticsearch.Net \连接\ HttpConnection.cs:线 199强制将其设置在响应上。>
响应: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客户端中执行此操作:
_client.Map<Activity>(m => m.AutoMap().Properties(p => p.GeoPoint(geo => geo.Name(n => n.Geoposition))));
_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
}
}
}
}
}
}
}
}
有人可以帮我解决这个问题吗?我无法理解为什么它不起作用以及为什么映射不起作用。
答案 0 :(得分:2)
到目前为止我使用stackoverflow的主要规则是:问题是由我创建的,因此解决方案已经在我内部。搜索它。
如果您遇到相同的错误,请检查您是否有索引创建代码。我没有一个。所以我的索引及其映射是在插入第一个文档时创建的(通过测试找到)。
答案是缺少这个字符串:
_client.CreateIndex(_defaultIndex, descriptor => descriptor.Mappings(ms => ms.Map<Activity>(m => m.AutoMap())));
弹性客户端初始化后
ElasticClient _client = new ElasticClient(settings);