C# 使用geoshape特性映射创建索引
我正在使用Elasticsearch的NEST客户端库为特定类型创建索引 该类型包含三个C# 使用geoshape特性映射创建索引,c#,
elasticsearch,nest,C#,
elasticsearch,Nest,我正在使用Elasticsearch的NEST客户端库为特定类型创建索引 该类型包含三个字符串属性,外加一个用于保存geo_形状类型(特别是用于信封形状) 问题是,生成的请求无法在ES中解析: { "error": "MapperParsingException[mapping [layer]]; nested: MapperParsingException[No handler for type [point] declared on field [boundingBox]]; ",
字符串
属性,外加一个用于保存geo_形状
类型(特别是用于信封
形状)
问题是,生成的请求无法在ES中解析:
{
"error": "MapperParsingException[mapping [layer]]; nested: MapperParsingException[No handler for type [point] declared on field [boundingBox]]; ",
"status": 400
}
NEST生成此错误消息的请求是:
POST /metadata
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
},
"mappings": {
"layer": {
"_all": {
"enabled": false
},
"properties": {
"namespace": {
"type": "string"
},
"name": {
"type": "string"
},
"abstract": {
"type": "string"
},
"boundingBox": {
"type": "point",
"tree": "geohash",
"tree_levels": 2,
"distance_error_pct": 0.025
}
}
}
}
}
我发现唯一阻止此请求成功的是boundingBox
属性的类型
声明,该属性的值应该是geo_shape
而不是point
这里是用于执行调用的C#代码:
ElasticClient client = new ElasticClient(settings);
IIndicesOperationResponse response = client.CreateIndex(c => c
.Index("metadata")
.NumberOfShards(1)
.NumberOfReplicas(0)
.AddMapping<ESLayer>(m => m
.Type("layer")
.AllField(a => a.Enabled(false))
.Properties(p => p
.String(x => x.Name(n => n.Namespace))
.String(x => x.Name(n => n.Name))
.String(x => x.Name(n => n.Abstract))
.GeoShape(x => x
.Name(n => n.BoundingBox)
.Tree(GeoTree.Geohash)
.TreeLevels(2)
.DistanceErrorPercentage(0.025)))));
请注意,我正在使用NEST附带的EnvelopeGeoShape
类来表示边界框属性
Elasticsearch版本:1.3.1
嵌套版本:1.0.2
有没有关于我可能缺少什么的线索?ES中没有点的类型。根据您的要求,您应该使用“geo_point”或“geo_shape” 见: 此外:
编辑:您正在使用的映射选项是针对geo_形状类型的这肯定是一个bug;接得好。我刚刚打开了这个问题,并推动了修复。它将包含在我们计划很快发布的下一个版本(1.1.0)中。同时,您可以从我们的CI构建中获取NuGet包:。谢谢,我意识到了这一点。但是我不是手工向ES写请求,而是通过NEST库。我的问题更多的是关于用于创建索引的.NET代码,如果它缺少什么,或者我可能面临一个嵌套错误。谢谢@Greg,听到这个消息很高兴!我将在下一版本发布后立即切换到下一版本。同时,我想测试一下夜间构建,但是myget现在似乎已经停止了。这个软件包还有其他来源吗?至少对我来说,Myget似乎工作得很好。唯一的另一个选择是克隆GitHub repo并编译解决方案。今天也尝试访问myget,现在它对我有效。干杯
private class ESLayer
{
public string Namespace { get; set; }
public string Name { get; set; }
public string Abstract { get; set; }
public EnvelopeGeoShape BoundingBox { get; set; }
}