2015-05-11 15 views
6

Questa è la mia prima domanda su questo sito Web, quindi cercherò di porre la domanda corretta.Indicizzazione di un documento mappato non mappato/dinamicamente con un geopoint nel client NEST elasticsearch

mentre si lavora con il client del nido elasticsearch uso l'indicizzazione di massa per archiviare i miei dati. Tutti i dati possono essere indicizzati con l'aiuto di un Dictionary<string, object>. La società che lavoro per insiste sulla mappatura dinamica, il che significa che non sono autorizzato a dichiarare le variabili che vanno ai nodi.

Dictionary <string, object> document_value= new Dictionary<string, object>(); 
Bulkcontainer.Index<object>(i => i.Index(index_name).Type(_type).Id(_id).Document(document_value)); 

Questo non è stato un problema fino all'utilizzo dei punti GEO. se questi non sono indicizzati come geopunti non saranno ricercabili, quando inseriti nel dictonary verranno impostati come stringa. non sono in grado di scavalcarli. i dati per geopoint sono dati al codice sotto forma di un altro dictonary chiamato 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); 
      } 
     } 
    } 

alcun aiuto a chiarire il problema sarà apprezzato


ho cambiato il tipo di indice di

public class ES_DATA_GEO 
{ 
public Dictionary<string, object> Data { get; set; } 
[ElasticProperty(Type = Nest.FieldType.GeoShape)] 
public GeoShape Locatiecoord { get; set; } 
} 

ma ora quando eseguo la query ancora doesnt registro Locatiecoord come Geo campo

Failed to find geo_shape field [locatiecoord]]; 

di nuovo qualsiasi aiuto è apprezzato

+0

Ciao Roy, ne ho uno simile, nel caso lo abbia risolto, fammelo sapere, ho posto la mia domanda qui. http://stackoverflow.com/questions/33579086/unable-to-insert-dynamic-object-to-elastic-search-using-nest – cmrhema

risposta

2

Secondo i documenti, i punti geografici non possono essere rilevati automaticamente con la mappatura dinamica. Vedere Geo Points

0

Se si crea l'indice in questo modo:

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())))) 

Allora il vostro approccio iniziale di indicizzazione del dizionario direttamente lavorerà a patto di avere una voce nel dizionario con il tasto "MyShapeFieldName", che ha una coordinata valore. Probabilmente è possibile modificare il mio esempio in modo che corrisponda in base al tipo (Coordinate) anziché al nome ("MyShapeFieldName"), ma non l'ho verificato.

Problemi correlati