Index ein dynamisches Objekt mit NEST
Baue ich eine API-Anwendung, die im wesentlichen ermöglicht es einem Benutzer, um ein Dokument zu erstellen, welche strukturiert sein kann, aber Sie wollen, dass gespeichert wird, in Elasticsearch. Im Grunde genommen bin ich bietet eine einfache Schnittstelle für Benutzer, um Zugriff auf unsere Elasticsearch-Instanz. Ich versuche, dass die Umsetzung so einfach wie möglich. Hier ist, was ich bin den Umgang mit so weit.
Objekt für die zu erwartende Körper:
public class DocumentModel
{
public string Index { get; set; }
public string Type { get; set; }
public string Id { get; set; }
[ElasticProperty(Type = FieldType.Nested)]
public dynamic Document { get; set; }
}
Einfache Implementierung:
[HttpPost]
[Route("")]
public IHttpActionResult Post(DocumentModel document)
{
Uri nodeLocation = new Uri("http://localhost:9200");
IConnectionPool connectionPool = new SniffingConnectionPool(new List<Uri> { nodeLocation });
ConnectionSettings settings = new ConnectionSettings(connectionPool);
ElasticClient esClient = new ElasticClient(settings);
IIndexResponse result = esClient.Index(document, i => i
.Index(document.Index)
.Type(document.Type)
.Id(document.Id));
return Ok(result.IsValid);
}
Dies funktioniert gut, aber es enthält den Index, Type und Id in der Quelle. Was ich wirklich mag zu tun ist, geben Sie einfach diese drei Stücke von Informationen, die bei der Indizierung werden aber eigentlich nur index-Dokument.Dokument, das von einem dynamischen Typ. Aber, das scheint zu widersprechen Nest, so wirft es einen Fehler in der IDE und zur compile-Zeit:
"Eine anonyme Funktion oder Methode, die Gruppe kann nicht verwendet werden, als Bestandteil Wert einer dynamisch gebundenen Betrieb"
"Nicht mit einem lambda-Ausdruck als argument an eine dynamisch ausgelöst operation ohne erste casting es zu einer Delegierten-oder expression-Baum-Typ".
Wie kann ich den index nur document.Document
? Gibt es eine bessere Art das zu handhaben, eine eingehende JSON-Dokument von unbekannter Struktur, als mit einem dynamischen Typ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, dies zu tun.
Versuchen, das Dokument zu indizieren, da der dynamic-Typ wird nicht funktionieren, aber Sie können den index als Objekt durch die IndexRequest Objekt.
Oder wenn der Umgang mit Dokumenten in der Masse
NEST (oder, genauer gesagt, Elasticsearch.Net) hat auch eine .Raw-Methode Variante angebracht, um die ElasticClient Klasse, die index rohen JSON. Mit Raw.Index() lässt uns Dinge tun, wie diese:
Den typdeskriptor für die Antwort ist der Typ, den Sie ' ll erwarten, dass die Antwort in (string bedeutet, Sie haben ein serialisiertes json-Antwort, die Sie Deserialisieren können und etwas mit). Dies ermöglicht es uns, sidestep das gesamte Objekt Typ Ausgabe NEST und indiziert das Dokument in Elasticsearch genau wie erwartet.
dynamic
ich verwendet habeDictionary<string, object>
oder beerben der Klasse. Warnung: wenn Sie Erben vonDictionary
NEST wird nicht automap die anderen Eigenschaften in Ihr Dokument ein (setzen Sie Sie in das Wörterbuch eingefügt werden). Das klappte auch gut für variable Attribute: gemeinsame Attribute, ging in die POCO-Eigenschaften, Variablen-Attribute gingen in einData
Eigenschaft (mit TypDictionary<string,object>
). Diese bulk-Methode ist einfach zu verwenden. Vergessen Sie nicht, schauen Sie sich das Ergebnis des Aufrufs vonBulk
zu prüfen.Errors
usw!