2013-10-23 6 views
6

Ich möchte die ID automatisch generiert werden, wenn ich ein Dokument in elastische Suche indizieren. Das funktioniert gut, wenn ich in meinem poco keine Id-Eigenschaft angegeben habe.Automatische ID-Generierung und Zuordnung _id NEST

Was ich tun möchte, ist das Zuordnen der zugrunde liegenden _id-Feld auf meine Poco-Klasse beim Abrufen und Verwenden von automatisch generierten ID beim Indexieren. Es sieht so aus, als könnte ich entweder die ID angeben oder nicht. Sind ihre irgendwelche Nest API Optionen, die ich vermisse?

EDIT

Beispiel Kern https://gist.github.com/antonydenyer/9074159

+0

Wenn Sie Ihren HTTP-Anforderung machen mit POST anstelle von PUT, Elasticsearch ID automatisch erstellt wird. – uzay95

Antwort

-1

Scheinen, dass NEST auto "Id" Feld in der Klasse erkennen und es zu "_id" auf ES abzubilden. Deine Anforderungen sehen komisch aus, aber warum nicht 2 Klassen dafür erstellen? Eine für die Indizierung (ohne Id-Feld), eine für die Indizierung (von der Indizierungsklasse geerbt und das neue Feld "Id" deklariert)?

z.B .:

public class DataForIndex 
{ 
    public string Name { get; set; } 
    // some other fields... 
} 

public class DataForGet : DataForIndex 
{ 
    public int Id { get; set; } 
} 
+0

Danke für die Antwort, das geht leider nicht. Im Moment bereichere ich die Klasse nur mit anderen Mitteln. Es ist nicht sehr elegant und nur gefragt, ob es einen besseren Weg gab. –

+0

@antonydenyer können Sie Ihre Frage mit warum Duc.Duong vorgeschlagene Antwort nicht funktioniert aktualisieren? Dies ist der beste Weg, um dieses Problem anzugehen, aber Sie müssen auch berücksichtigen, dass die Verschachtelung versucht, die Index- und Typnamen für die von Ihnen verwendeten Klassen zu erraten. Sie können sie beheben, indem Sie angeben, wie Klassen den Index-/Typnamen in ConnectionSettings zugeordnet werden. –

+0

@MartijnLaarman Ich werde versuchen, einige Zeit zu verbringen, um ein Beispiel zu geben, was ich meine, und poste das Wesentliche hier, wenn ich es tue. Duc-duong Vorschlag macht Sinn, aber leider hat es für mich nicht out of the box funktioniert. Ich erinnere mich an die Dekoration der Klasse und die Angabe der Art, aber ich kann nicht sicher sein. Es könnte einfach so sein. –

2

Wie @ Duc.Duong sagte in den Kommentaren Sie Id DocumentWithMeta zugreifen können. In der aktuellen Version von NEST DocumentsWithMetaData wird durch Hits ersetzt und Sie sollten auch IHit<DataForGet>.Id von string zu int zu werfen.

dies ist mein Code:

public class DataForIndex 
{ 
    public string Name { get; set; } 
    // some other fields... 
} 

public class DataForGet : DataForIndex 
{ 
    public int Id { get; set; } 
} 

var result = client.Search<DataForGet>(x => x.Index("index").MatchAll()); 
var list = results.Hits.Select(h => 
            { 
             h.Source.Id = Convert.ToInt32(h.Id); 
             return h.Source; 
            }).ToList(); 
2

Automatic ID Generation

Der Index Vorgang ohne die Angabe der ID ausgeführt werden. In diesem Fall wird automatisch eine ID generiert. Außerdem wird der op_type automatisch so eingestellt, dass er erstellt wird. Hier ist ein Beispiel (beachten Sie die POST anstelle von PUT verwendet):

$ curl -XPOST 'http://localhost:9200/twitter/tweet/' -d '{ 
    "user" : "kimchy", 
    "post_date" : "2009-11-15T14:12:12", 
    "message" : "trying out Elasticsearch" 
}' 

Ergebnis:

{ 
    "_index" : "twitter", 
    "_type" : "tweet", 
    "_id" : "6a8ca01c-7896-48e9-81cc-9f70661fcb32", 
    "_version" : 1, 
    "created" : true 
} 
+0

Ja, beachten Sie den POST anstelle von PUT –