这是我在本网站上的第一个问题,所以我会尝试正确地提出这个问题。
在使用elasticsearch nest客户端时,我使用批量索引来存储我的数据。所有数据都可以在Dictionary<string, object>
的帮助下编制索引。
我工作的公司坚持动态映射,这意味着我不允许声明转到节点的变量。
Dictionary <string, object> document_value= new Dictionary<string, object>();
Bulkcontainer.Index<object>(i => i.Index(index_name).Type(_type).Id(_id).Document(document_value));
在使用GEO积分之前,这不是问题。 如果它们没有被编入索引作为地理位置,则它们将无法搜索,当放置在dictonary时它们将默认为字符串。我无法覆盖它们。 geopoint的数据以另一个名为geofields的dictonary的形式提供给代码。
PointGeoShape coord = new PointGeoShape();
Dictionary<string, PointGeoShape> geovalue = new Dictionary<string, PointGeoShape>();
if (geofields!= null)
{
foreach (KeyValuePair<string, object> geo in geofields)
{
string veldnaam = geo.Key.ToUpper();
string temp = geo.Value.ToString();
if (temp != "")
{
string[] array = temp.Split(new char[] { ',' }, 2);
List<double> list = new List<double>();
list.Add(double.Parse(array[0]));//lon
list.Add(double.Parse(array[1]));//lat
IEnumerable<double> latlon = list;
coord.Coordinates = latlon;
document_value.Add(veldnaam, coord);
}
}
}
任何帮助澄清我的问题都将不胜感激
我将索引类型更改为
public class ES_DATA_GEO
{
public Dictionary<string, object> Data { get; set; }
[ElasticProperty(Type = Nest.FieldType.GeoShape)]
public GeoShape Locatiecoord { get; set; }
}
但现在当我执行查询时,它仍然没有将Locatiecoord注册为Geo字段
Failed to find geo_shape field [locatiecoord]];
再次感谢任何帮助
答案 0 :(得分:3)
根据文档,无法使用动态映射自动检测地理点。见Geo Points
答案 1 :(得分:1)
如果您创建这样的索引:
var created = client.CreateIndex("MyIndexName",
c => c.AddMapping<dynamic>(m => m.Type("_default_").
DynamicTemplates(t => t.Add(f => f.Name("shape_fields")
.Match("MyShapeFieldName").Mapping(ma => ma.GeoPoint(s =>
s.IndexGeoHash().IndexLatLon()))))
然后,假设您的词典中的条目“MyShapeFieldName”具有Coordinate值,那么直接索引字典的初始方法将起作用。您可以根据类型(坐标)而不是名称(“MyShapeFieldName”)更改我的样本以匹配,但我还没有测试过。