2016-08-03 15 views
0

Wir suchen, um von einer relationalen Datenbank zu elastischer Suche zu wechseln, und ich versuche, mit Nest ein paar grundlegenden Code zum Laufen zu bringen. Wir haben bestehende Objekte, die guids für ids verwenden, die ich in einem elastischen Suchindex speichern möchte.Elastische Suche mit GUID ID ohne Attribute

Ich möchte keine spezifischen Attribute hinzufügen, da die Klasse in verschiedenen Anwendungen verwendet wird und ich keine unnötigen Abhängigkeiten zu Nest hinzufügen möchte.

Im Moment sieht mein Code wie folgt aus:

var node = new Uri("http://localhost:9200"); 
var settings = new ConnectionSettings(node) 
settings.DefaultIndex = "test"; 
var client = new ElasticClient(settings); 

var testItem = new TestType { Id = Guid.NewGuid(), Name = "Test", Value = "10" }; 

var response = client.Index(testItem); 

Mit Testtype als:

public class TestType 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public decimal Value { get; set; } 
} 

aber ich erhalte eine Fehlermeldung wie:

ServerError: 400Type: mapper_parsing_exception Reason: "failed to parse [id]" CausedBy: "Type: number_format_exception Reason: "For input string: "c9c0ed42-86cd-4a94-bc86-a6112f4c9188""

Ich glaube, ich angeben müssen ein Mapping, das dem Server mitteilt, dass die Id eine Zeichenkette ist, aber ich kann keine Beispiele oder Dokumentation darüber finden, wie ich das ohne Verwendung mache die Attribute.

Antwort

1

Angenommen, Sie verwenden Elasticsearch 2.x und NEST 2.x (z. B. das neueste von beiden zum Zeitpunkt des Schreibens ist Elasticsearch 2.3.5 und NEST 2.4.3), dann NEST will automatically infer the id of a POCO by default from the Id property. Im Falle einer GUID-ID wird diese in Elasticsearch als String gespeichert.

Hier ist ein Beispiel, das Sie

void Main() 
{ 
    var node = new Uri("http://localhost:9200"); 
    var settings = new ConnectionSettings(node) 
     // default index to use if one is not specified on the request 
     // or is not set up to be inferred from the POCO type 
     .DefaultIndex("tests"); 

    var client = new ElasticClient(settings); 

    // create the index, and explicitly provide a mapping for TestType 
    client.CreateIndex("tests", c => c 
     .Mappings(m => m 
      .Map<TestType>(t => t 
       .AutoMap() 
       .Properties(p => p 
        // don't analyze ids when indexing, 
        // so they are indexed verbatim 
        .String(s => s 
         .Name(n => n.Id) 
         .NotAnalyzed() 
        ) 
       ) 
      ) 
     ) 
    ); 

    var testItem = new TestType { Id = Guid.NewGuid(), Name = "Test", Value = "10" }; 

    // now index our TestType instance 
    var response = client.Index(testItem); 
} 

public class TestType 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public decimal Value { get; set; } 
} 

Take a look at the Automapping documentation for more examples, wie man explizit eine POCO Karte zur Steuerung norms, analyzers, multi_fields usw.

+0

Das hat es behoben, danke. Ich habe diese Dokumentation gefunden, aber ich denke nicht, dass es sehr gut ist, wahrscheinlich in Ordnung als Referenz, aber für jemanden, der gerade mit der API anfängt, ist es nicht einfach, überhaupt zu folgen. – Mant101

+0

@ Mant101 zögern Sie Fragen hier zu stellen oder https://discuss.elastic.co/c/elasticsearch. Pull-Anfragen für die Dokumentation auch sehr willkommen;) –

0

Was ich normalerweise mache, ist eine separate Klasse, die nur für Elasticsearch spezifisch ist. Und verwenden Sie Automapper, um das in ein DTO oder ViewModel oder Model in das ElasticSearch-Dokument zu mappen.

Auf diese Weise müssen Sie kein Objekt mit einer Abhängigkeit in NEST und nur für Elasticsearch spezifische Attribute verfügbar machen.

Ein weiterer guter Grund ist, dass Dokumente in ES normalerweise flach sind, also würden Sie normalerweise Ihre Objekte reduzieren, bevor Sie sie an ES indizieren.

+0

Diese Typen sind schon flach, wie sie in einem loslegen gespeichert werden relational DB, das ist ihre primäre Funktion. Sie werden auch in einer Website an Orten verwendet, wo es sich nicht lohnt, ein Ansichtsmodell zu haben. Es gibt auch viele von ihnen und ich möchte sie nicht alle kopieren. – Mant101

+0

Verstanden, scheint es, dass aus der Fehlermeldung. NEST konnte auf das ID-Feld schließen, konnte aber den Typ Guid nicht ableiten. –