当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch NEST v.5.0.1按地理位置误差排序

景鹏飞
2023-03-14

我在Web API项目中使用NEST时遇到了一个问题,因为它是按Geo距离排序的。我有:

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

昨天,我决定实施地理距离排序,但所有可能的解决方案都导致我在搜索/排序请求中出现此异常:

从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、Task1 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客户端中做到这一点:

  1. \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
              }
            }
          }
        }
      }
    }
  }
}

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


共有1个答案

邢英奕
2023-03-14

到目前为止,我使用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,我们可以找到经度和纬度。 示例的示例代码可在下面获得。