2017-08-10 20 views
0

私は座標フィールドを持つPOCOを持っており、NESTを使ったマッピングと地理位置検索はすべて期待通りに機能します。しかし、NESTを使ってやってみようとしているのは、GeoDistanceクエリで指定されたポイントから検索結果の一部として距離を返すことです。私の研究はこれまでに、これを行うには二つの方法があることを示していますElasticsearchでNESTで作成されたクエリでスクリプトフィールドにアクセスするにはどうすればよいですか?

を実行し、クエリの一部としてスクリプトフィールドを作成します

public class User 
{ 
    public int ID { get; set; } 
    [GeoPoint] 
    public Coordinate Location { get; set; } 
} 

とクエリ自体::オプション2、ここでは、コードの一部は次のようになります。

var results = elasticClient.Search<User>(s => s 
    .Index("user") 
    .Query(q => q 
     .GeoDistance(gd => gd 
      .Field(f => f.Location) 
      .Distance(Distance.Miles(distance)) 
      .Location(GeoLocation.TryCreate(data.Latitude, data.Longitude)) 
     ) && q 
     .Exists(e => e 
      .Field("location") 
     ) 
    )  
    .ScriptFields(sf => sf 
     .ScriptField("distance", sf2 => sf2 
      .Inline(String.Format("doc['location'].arcDistance({0},{1})", data.Latitude, data.Longitude))  
      .Lang("painless") 
     ) 
    )     
); 

elasticsearchに対して直接このクエリを実行すると、細かい思えますが、私はそれをNESTを行うとき、私はいくつかの問題があります:

  • 私は私がない限り、私のPOCOオブジェクトで定義された「距離」スクリプトのフィールドにアクセスすることはできません
  • User POCOのサブクラスを作成した場合、ElasticSearchは親クラスに定義されているフィールドを逆シリアル化しません(これはIDまたはLocationフィールドではなくDistanceスクリプトフィールドのみを取得することを意味します)配列オブジェクトはすべてnullです)
  • 私は分離を維持しようとしています実際のPOCOをマッピングに使用すると、検索結果オブジェクトが見つかりませんが、NESTがマップしないように属性/フィールドをマークする方法はわかりませんが、スクリプトフィールドの結果をプロパティに逆シリアル化して

質問:NESTのスクリプトフィールドにアクセスするにはどうすればよいですか?私は完全に自動マッピングをやめなければなりませんか?または、結果を並べ替えることは特に望んでいませんが、並べ替えオプションを選択するだけですか?

+0

私は誰かが同様のクエリを持っていたと思う - https://github.com/elastic/elasticsearch-net/issues/432 - しかし、私はヒットオブジェクトの生のフィールドにアクセスできるという提案された解決策はないと思いますこれまで実装されたのですか? –

答えて

0

私は最終的に近い私がで欲しいものを得ることができた:明示的_source保存されたフィールドが含まれるように、私のクエリを伝える

  • - if you use any script fields you need to do thisまたは_source /書類は返却いたしませんようです。私のスクリプトのフィールドへのアクセス、その結果にHitsを列挙する際
  • 私の検索結果サブクラス
  • [ElasticsearchType(Name = "User")]属性を追加:

    ((JArray)item.Fields["distance"]).Value<double>(0)/1609.344 
    

誰もがこれを行うためのクリーンな方法を持っている場合は、私に教えてください!

関連する問題