/ / Mapping auf ElasticSearch-Server mit abgeleitetem Mapping aus der C # -Klasse vergleichen? - c #, elasticsearch, nest

Vergleichen Sie das Mapping auf dem ElasticSearch-Server mit dem abgeleiteten Mapping aus der C # -Klasse? - c #, elasticsearch, Nest

Ich habe einen ASP.NET WebForms-Webanwendung, die ElasticSearch (mithilfe der NEST-API) für die automatische Vervollständigung der Suche verwendet, und es funktioniert hervorragend. Von Zeit zu Zeit ändert sich jedoch die Struktur des Dokuments (ich habe nur einen Dokumenttyp), das in ElasticSearch gespeichert wird, und das Mapping muss sich damit ändern.

Mein Ansatz war es, die Master-Definition des Dokumenttyps (und des Mappings) in C # -Code zu haben (einfach eine C # -Klasse mit relevanter Klasse) ElasticProperty Attribute für seine Eigenschaften festgelegt). Ich möchte NEST fragen können, ob die Mapping-Definition des ElasticSearch-Servers mit derjenigen übereinstimmt, die aus meiner Dokumentenklasse abgeleitet werden kann. Wenn nicht, aktualisieren Sie das Mapping des Servers. Etwas wie:

ElasticClient client = new ElasticClient(new ConnectionSettings(new Uri("http://localhost:9200")), "my_index");
// Hypothetical code below - does NEST offen an API which lets me do this if statement?
if (!client.GetMapping("MyDocument").Matches<MyDocument>()) {
client.CloseIndex("my_index"); // Is this necessary when updating mapping?
client.Map<MyDocument>(m => m.MapFromAttributes());
client.OpenIndex("my_index");
}

Bietet NEST eine solche API an?

Antworten:

0 für die Antwort № 1

Kann auf diese Weise ausgeführt werden, ohne etwas im Cluster zu erstellen:

var getIndexResponse = await _elasticClient.GetIndexAsync(indexName);
IIndexState remote = getIndexResponse.Indices[indexName];
// move the index definition out of here and use it to create the index as well
IIndexState local = new CreateIndexDescriptor(indexName);
// only care about mappings
var areMappingsSynced = JToken.DeepEquals
(
JObject.Parse(_elasticClient.Serializer.SerializeToString(new { local.Mappings })),
JObject.Parse(_elasticClient.Serializer.SerializeToString(new { remote.Mappings }))
);