[英]C# calculate geodistance with elastic search (nest 2)
我正在實現一個能夠接收最近的10個對象的程序。 作為數據庫我使用ElasticSearch,我的模型看起來像這樣。
[Nest.ElasticsearchType(Name = "eventelastic", IdProperty = "Id")]
public class EventElastic:BaseElastic
{
[Nest.String]
public string EventName { get; set; }
[Nest.Date]
public DateTime CreateTime { get; set; }
[Nest.String]
public string Country { get; set; }
[Nest.String]
public string City { get; set; }
[Nest.String]
public string Place { get; set; }
[Nest.Boolean]
public bool IsPrivate { get; set; }
[Nest.Boolean]
public bool IsSponsored { get; set; }
[Nest.String]
public string ImageWeb { get; set; }
[Nest.Number]
public int MaxPersons { get; set; }
[Nest.GeoPoint]
public LocationModel Location { get; set; }
}
[Nest.ElasticsearchType(Name = "location", IdProperty = "Id")]
public class LocationModel
{
public LocationModel(double lon, double lat)
{
Lon = lon;
Lat = lat;
}
public double Lon { get; set; }
public double Lat { get; set; }
}
我創建了一個這樣的索引
connection.CreateIndex("index", s => s.Mappings(f => f.Map<EventElastic>(m => m.AutoMap().Properties(p=> p.GeoPoint(g => g.Name(n => n.Location))))));
我插入這樣的新文件
var response = connection.IndexAsync<EventElastic>(model, idx => idx.Index("index"));
response.ContinueWith(t =>
{
if (!t.Result.IsValid)
{
log.Error(t.Result.ServerError.Error.Reason);
}
});
設置了模型的所有值,並且它可以正常工作。
但是現在我想在10公里范圍內得到最近的10個。 我這樣查詢
var geoResult = connection.Search<EventElastic>(s => s.From(0).Size(10)
.Query(query => query.Bool(b => b.Filter(filter => filter
.GeoDistance(geo => geo
.Field(f => f.Location) //<- this
.Distance("10km").Location(lon, lat)
.DistanceType(GeoDistanceType.SloppyArc)
))
)
)
);
但它不會返回任何文件,但如果我將距離值設置為10000km,它會返回一個文件。
我在模型中使用的數據是:LAT:47.4595248 LON:9.6385962
我在搜索中使用的位置:拉特:47.4640298 LON:9.6389685
這些地方相距100米。 有人可以幫助我在我的代碼中找到錯誤嗎? 是否有可能從彈性搜索服務器獲得計算的距離?
順便說一句:我正在設置默認索引
var settings = new ConnectionSettings(pool).DefaultIndex("index");
編輯我發現了錯誤:
var geoResult = connection.Search<EventElastic>(s => s.From(0).Size(10)
.Query(query => query.Bool(b => b.Filter(filter => filter
.GeoDistance(geo => geo
.Field(f => f.Location)
.Distance("10km").Location(lat, lon) //wrong parameter
.DistanceType(GeoDistanceType.SloppyArc)
))
)
)
);
我不得不改變lat和lon的位置。
但我沒有得到計算的距離,有人知道我怎么能得到距離?
最好的祝福
您可以向文檔添加Distance
,並在查詢中使用sctipt字段來更新此值。
var geoResult = client.Search<EventElastic>(s => s.From(0).Size(10)
.ScriptFields(sf => sf
.ScriptField("distance", descriptor => descriptor
.Inline("doc[\u0027location\u0027].distanceInKm(lat,lon)")
.Lang("groovy")
.Params(f => f.Add("lat", lat).Add("lon", lon))))
.Query(query => query.Bool(b => b.Filter(filter => filter
.GeoDistance(geo => geo
.Field(f => f.Location)
.Distance("10km").Location(lat, lon)
.DistanceType(GeoDistanceType.SloppyArc)
))
)
)
.Sort(sort => sort
.GeoDistance(g => g
.Field(f => f.Location)
.Order(SortOrder.Ascending)
.PinTo(new GeoLocation(1.5, 1))
.DistanceType(GeoDistanceType.SloppyArc)))
);
public class EventElastic
{
..
public double Distance {get;set;}
}
來自elasticsearch的回復:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": null,
"hits": [
{
"_index": "my_index",
"_type": "data",
"_id": "1",
"_score": null,
"fields": {
"distance": [
55.65975203179589
]
},
"sort": [
55659.66677843493
]
},
{
"_index": "my_index",
"_type": "data",
"_id": "2",
"_score": null,
"fields": {
"distance": [
124.45896068602408
]
},
"sort": [
124411.81715215484
]
}
]
}
}
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.