我正在实现一个程序,能够接收10个最近的对象。作为数据库,我使用弹性搜索,我的模型看起来像这样。
[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
我在搜索中使用的位置:LAT:47.4640298 LON:9.6389685
那些地方相距100米。有人能帮我找到代码中的错误吗?是否有可能得到从elasticsearch服务器计算的距离?
顺便说一句:我正在设置默认索引
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的位置。
但是我没有得到计算的距离,有人知道我如何得到距离吗?
最好的问候
您可以将距离添加到文档中,并在查询中使用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
]
}
]
}
}
希望能有帮助。
我已经为一个问题挣扎了一段时间,所以我想我应该通过stackoverflow来解决这个问题。 “我的文档类型”有一个标题、一个语言字段(用于筛选)和一个分组id字段(我省略了所有其他字段以保持重点) 搜索文档时,我希望找到包含标题中文本的所有文档。对于每个唯一的分组id,我只需要一个文档。 我一直在关注tophits聚合,从我所看到的情况来看,它应该能够解决我的问题。 对我的索引运行此查询时: 我
如何使用嵌套库在弹性搜索中仅删除嵌套对象而不删除索引。 在上面的映射中,我想删除模型的一个条目,而不删除整个索引。 我尝试使用DeleteByQuery删除,但它会删除整个Make索引。
如何获得空数组和美国的结果和
我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。
如何计算弹性搜索服务器磁盘空间,每天4TB日志需要多少节点。 需要多少磁盘空间存储在弹性搜索索引中? 如何计算节点数? 索引是否压缩? 在LogStash的行格式中存储10G日志需要多少磁盘空间? 索引是否压缩? 如果节点配置为使用5个碎片,则以下是真还是假,以及为什么 存储10G日志需要50G磁盘空间来存储5个分片节点吗?
我正在尝试按地理距离对具有嵌套地理点映射的索引进行排序。 这是我的简化映射: 这里,每个组织可以有几个地点点。 文档: 这是我的查询(PHP数组): 预期结果 : 我希望按geo_point排序资源(检查每个位置,然后检查某个位置是否靠近给定的纬度/经度)