私は座標フィールドを持つPOCOを持っており、NESTを使ったマッピングと地理位置検索はすべて期待通りに機能します。しかし、NESTを使ってやってみようとしているのは、GeoDistanceクエリで指定されたポイントから検索結果の一部として距離を返すことです。私の研究はこれまでに、これを行うには二つの方法があることを示していますElasticsearchでNESTで作成されたクエリでスクリプトフィールドにアクセスするにはどうすればよいですか?
- request a sort on the location
- 私が使用して実行することを決めた距離計算インライン
を実行し、クエリの一部としてスクリプトフィールドを作成します
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のスクリプトフィールドにアクセスするにはどうすればよいですか?私は完全に自動マッピングをやめなければなりませんか?または、結果を並べ替えることは特に望んでいませんが、並べ替えオプションを選択するだけですか?
私は誰かが同様のクエリを持っていたと思う - https://github.com/elastic/elasticsearch-net/issues/432 - しかし、私はヒットオブジェクトの生のフィールドにアクセスできるという提案された解決策はないと思いますこれまで実装されたのですか? –