我在Web API项目中使用NEST时遇到了一个问题,因为它是按Geo距离排序的。我有:
昨天,我决定实施地理距离排序,但所有可能的解决方案都导致我在搜索/排序请求中出现此异常:
从POST:/activities/activity/\u搜索此API调用的审核跟踪失败的低级调用生成的嵌套响应无效:
[1]坏响应:节点:超文本传输协议://MY_SERVER_IP: 9200/取:00:00:00.3129217服务器错误:服务器错误: 400类型:search_phase_execution_exception原因:"所有分片失败"导致:"类型:
illegal_argument_exception原因:
原始概念:系统。网WebException:远程服务器返回错误:(400)请求错误。在系统中。网HttpWebRequest。系统上的EndGetResponse(IAsyncResult asyncResult)
。穿线。任务。TaskFactory<代码>1。FromAsyncCoreLogic(IAsyncResult iar、Func2 endFunction、Action1 endAction、Task
1 promise、Boolean requiresSynchronization)——系统上引发异常的上一个位置的堆栈结束跟踪。运行时。编译器服务。任务等待者。系统中的ThrowForNonSuccess(任务任务)。运行时。编译器服务。任务等待者。系统上的HandleNonSuccessAndDebuggerNotification(任务)。运行时。编译器服务。任务等待者。Elasticsearch上的ValidateEnd(任务)
。网HttpConnection。迪乌9'1。C:\Users\russ\source\elasticsearch-net-5中的MoveNext()。x\src\Elasticsearch。Net\Connection\HttpConnection。政务司司长:第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客户端中做到这一点:
\u客户端。地图
我的当前查询(请提供上述错误):
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
}
}
}
}
}
}
}
}
有人能帮我解决这个问题吗?我不明白为什么它不起作用,为什么映射不起作用。
到目前为止,我使用stackoverflow得到的主要规则是:问题是由我创建的,所以解决方案已经在我体内了。搜索它。
如果遇到相同的错误,请检查是否有索引创建代码。我没有。所以我的索引和它的映射是在插入第一个文档时创建的(通过测试发现)。
答案是缺少以下字符串:
_client.CreateIndex(_defaultIndex, descriptor => descriptor.Mappings(ms => ms.Map<Activity>(m => m.AutoMap())));
就在弹性客户端初始化之后
ElasticClient _client = new ElasticClient(settings);
使用微信内置地图查看位置接口 wx.openLocation({ latitude: 0, // 纬度,浮点数,范围为90 ~ -90 longitude: 0, // 经度,浮点数,范围为180 ~ -180。 name: '', // 位置名 address: '', // 地址详情说明 scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大 inf
在 Redis 3.2 版本中,新增了存储地理位置信息的功能,即 GEO(英文全称 geographic),它的底层通过 Redis 有序集合(zset)实现。不过 Redis GEO 并没有与 zset 共用一套的命令,而是拥有自己的一套命令。 Redis GEO 提供了 6 个常用命令: GEOADD GEOPOS GEODIST GEORADIUS GEORADIUSBYMEMBER GEO
geolocation对象提供了对设备GPS传感器的访问。 Geolocation提供设备的位置信息,例如经度和纬度。位置信息的常见来源包括全球定位系统(GPS),以及通过诸如IP地址、RFID、WiFi和蓝牙的MAC地址、和GSM/CDMA手机ID的网络信号所做的推断。不能保证该API返回的是设备的真实位置信息。 这个API是基于W3C Geo location API Specificatio
HTML5 Geolocation API可让您与喜爱的网站分享您的位置。 JavaScript可以捕获您的纬度和经度,并可以发送到后端Web服务器并执行奇特的位置感知事项,例如查找本地商家或在地图上显示您的位置。 今天,大多数浏览器和移动设备都支持Geolocation API。 地理定位API使用全局导航器对象的新属性,即。 地理位置对象可以创建如下 - var geolocation = n
bugu-mongo支持地理位置数据的存储、索引、查询。相关的类都位于com.bugull.mongo.geo包中。 注意: MongoDB对于地理位置数据,默认使用的是WGS84坐标系。如果你的地理位置数据来源是其他坐标系的,请记得先进行转换。 存储、索引 MongoDB能够存储不同类型的地理位置数据,这些数据都是GeoJSON格式。 目前,bugu-mongo支持: Point LineStr
HTML5位置 HTML5 Geolocation API可让您与喜爱的网站分享您的位置。 Javascript可以捕获您的纬度和经度,并且可以发送到支持的Web服务器并执行奇特的位置感知事项,例如查找本地商家或在地图上显示您的位置。 经度和纬度 使用HTML5,我们可以找到经度和纬度。 示例的示例代码可在下面获得。