2017-01-31 17 views
1

私はGeoDistanceによってソートするための私のWeb APIプロジェクトでNESTを使用して問題に直面しました。 私が持っている:とElasticsearchのNESTのv.5.0.1ソート

  • サーバーElasticsearchのV5.1.1(ワーキング良い)(基本的なCRUDと 検索操作が良い作業している)がインストールNESTのバージョン5.0.1と
  • シンプルな.NETのWeb APIアプリケーション
私はGeoDistanceでソートを実装することを決定した

昨日、私は検索/ソートのリクエストでこの例外に私を導いていたが、すべての可能な解決策:

Invalid NEST response built from a unsuccessful low level call on POST: /activities/activity/_search Audit trail of this API call:

[1] BadResponse: Node: http://MY_SERVER_IP:9200/ Took: 00:00:00.3129217 ServerError: ServerError: 400Type: search_phase_execution_exception Reason: "all shards failed" CausedBy: "Type:

illegal_argument_exception Reason:

"failed to find mapper for [geoposition] for geo distance based sort""

OriginalException: System.Net.WebException: The remote server returned an error: (400) Bad Request. at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction, Action 1 endAction, Task 1 promise, Boolean requiresSynchronization) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Elasticsearch.Net.HttpConnection.d__9`1.MoveNext() in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection.cs:line 199

Request:

force it to be set on the response.>

Response:

ConnectionSettings to force it to be set on the response.>

マイモデル:

[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クライアントの初期化:私は私は本当に新しいNESTクライアントでこれを行う方法を取得していないので、二つの異なるマッピングアプローチを試してみました

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

  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))));

私の現在のクエリ(私は上記のエラー与える):elasticsearchサーバーから

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)))); 

マイマッピング応答:

{ 
    "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

はるかに私はstackoverflowのを使用してしまった主なルールは次のとおりです。解決策は、私の中すでにあるので、問題は、私が作成されました。それを探してください。あなたは、インデックスの作成コードを持っている場合は、これまでと同じエラーチェックに直面した場合

。私は持っていなかった。だから、私のインデックスとそれのマッピングは、最初の文書(テストで見つかった)の挿入時に作成されました。

答えは、この不足している文字列です。

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

弾性クライアントは `geo_point`フィールドマッピングのため

ElasticClient _client = new ElasticClient(settings); 
+1

を初期化した直後には、明示的にマッピングし、マッピングは、インデックス内に作成されていることを確認する必要がありますあなたに何か書類を送る前に、 –

+1

@RussCam、コメントしてくれてありがとう。私が知っている限り、あなたはRussからc:/ users/russの1人だと理解しています:)あなたは正しいです、私は明らかに生産上の問題を防ぐためにインデックスを明示的にマッピングする必要があります。 – Mausic

関連する問題