将ElasticSearch服务器上的映射与C#类中推断的映射进行比较
本文关键字:映射 比较 服务器 ElasticSearch | 更新日期: 2023-09-27 18:24:55
我有一个ASP.NET WebForms web应用程序,它使用ElasticSearch(使用NEST API)进行自动完成搜索,效果很好。然而,存储在ElasticSearch中的文档结构(我只有一种类型的文档)不时发生变化,映射也需要随之改变
我的方法是在C#代码中对文档类型(和映射)进行主定义(只是一个在其属性上设置了相关ElasticProperty
属性的C#类)。我希望能够询问NEST ElasticSearch服务器的映射定义是否与可以从我的文档类推断出的映射定义匹配,如果不匹配,则更新服务器的映射。类似于:
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");
}
NEST提供这样的API吗?
可以这样做,而无需在集群中创建任何东西:
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 }))
);