Elasticsearch NEST v.5.0.1按GeoDistance错误排序

时间:2017-01-31 10:59:21

标签: c# .net elasticsearch nest

我在Web Api项目中使用NEST进行GeoDistance排序时遇到了问题。 我有:

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

昨天我决定用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.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction,Action 1 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客户端中执行此操作:

  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))));
  3. 我当前的查询(给我上面描述的错误):

    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 个答案:

答案 0 :(得分:2)

到目前为止我使用stackoverflow的主要规则是:问题是由我创建的,因此解决方案已经在我内部。搜索它。

如果您遇到相同的错误,请检查您是否有索引创建代码。我没有一个。所以我的索引及其映射是在插入第一个文档时创建的(通过测试找到)。

答案是缺少这个字符串:

_client.CreateIndex(_defaultIndex, descriptor => descriptor.Mappings(ms => ms.Map<Activity>(m => m.AutoMap())));
弹性客户端初始化后

ElasticClient _client = new ElasticClient(settings);