2015-05-11 44 views
6

這是我在這個網站上的第一個問題,所以我會試着問這個問題是否正確。在elasticsearch NEST客戶端中使用一個地理點爲一個未映射/動態映射的文檔建立索引

同時使用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時,它們將默認爲字符串。我無法覆蓋他們。 地址的數據以另一個稱爲geofields的冠詞形式提供給代碼。

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作爲地理字段

Failed to find geo_shape field [locatiecoord]]; 

再次任何幫助理解

+0

嗨,羅伊,我有一個類似的,如果你已經解決了,請讓我知道,我已經把我的問題放在這裏。 http://stackoverflow.com/questions/33579086/unable-to-insert-dynamic-object-to-elastic-search-using-nest – cmrhema

回答

2

根據該文檔,地理點不能自動與動態映射檢測。見Geo Points

0

如果您創建的索引是這樣的:

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」其中有一個條目的座標值。您可以更改我的示例以匹配基於類型(座標)而不是名稱(「MyShapeFieldName」),但我沒有測試過。

相關問題