C# ElasticSearch嵌套:通过指定json通过ElasticClient创建索引
我们允许客户端在创建索引时定义自定义分析器。我们更愿意在json中指定这一点,以便通过底层的ElasticSearch文档提供最大的灵活性和可理解性 我想使用json字符串中定义的分析器、映射器等的任意描述创建一个索引。凭感觉,我的命令是C# ElasticSearch嵌套:通过指定json通过ElasticClient创建索引,c#,elasticsearch,nest,C#,elasticsearch,Nest,我们允许客户端在创建索引时定义自定义分析器。我们更愿意在json中指定这一点,以便通过底层的ElasticSearch文档提供最大的灵活性和可理解性 我想使用json字符串中定义的分析器、映射器等的任意描述创建一个索引。凭感觉,我的命令是 PUT /my_index { "settings": { "analysis": { "char_filter" : { "
PUT /my_index
{
"settings":
{
"analysis":
{
"char_filter" :
{
"my_mapping" :
{
"type" : "mapping",
"mappings" : [".=>,", "'=>,"]
}
},
"analyzer":
{
"my_analyzer":
{
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase" ],
"char_filter" : ["my_mapping"]
}
}
}
}
}
}
理想情况下,我的代码看起来像
string json = RetrieveJson();
ElasticSearchClient client = InitializeClient();
client.CreateIndexUsingJson( json ); // this is the syntax I can't figure out
本文试图通过实例化一个IndexSettings,然后调用Add(“analysis”,json)来实现这一点,但Add不是我正在使用的ElasticSearch库版本中的函数
我可以想象的选项包括:
非常感谢上述#1或#2的其他选项或具体示例,这是解决此问题的推荐方法。如果您想执行上述操作,您只需使用HttpClient并将创建索引的请求发送到elasticsearch服务器即可。在这种情况下,您可以在请求的内容中包含JSON 请尝试以下方法:
public async void CreateIndex() {
using (var httpClient = new HttpClient()) {
using (var request = new HttpRequestMessage(HttpMethod.Put, new Uri("http://elastic_server_ip/your_index_name"))) {
var content = @"{ ""settings"" : { ""number_of_shards"" : 1 } }";
request.Content = new StringContent(content);
var response = await httpClient.SendAsync(request);
}
}
}
此特定代码段将使用一个碎片、一个副本(默认)以及默认设置和映射创建指定端点的索引。使用json更改内容变量。最简单的解决方案是实现原始问题中的选项1
public void CreateIndex(string indexName, string json)
{
ElasticClient client = GetClient();
var response = _client.Raw.IndicesCreatePost(indexName, json);
if (!response.Success || response.HttpStatusCode != 200)
{
throw new ElasticsearchServerException(response.ServerError);
}
}
在修补转换器、JsonReaders和JSONSerializer之后,我发现IndexSettingsConverter似乎没有正确地将任意设置json反序列化为有效的IndexSettings对象。感觉到一个兔子洞,我接受了Manolis的建议,并想出了如何直接对ElasticClient.IElasticsearchClient应用任意json,以避免对安全性和连接细节进行反向工程
要得出这一结论是非常痛苦的,如果不使用大量未记录的NEST代码,这是完全不可能的。好的,在更新到Elasticsearch NEST v6.0.2之后,我不得不修改我的代码,并想将其发布到这里,以供其他人使用。更改包括将
CreateResponse
作为函数的类型传入,以及在响应上使用ApiCall
属性
public bool CreateIndex(string indexName, string json)
{
var response = _client.LowLevel.IndicesCreate<CreateResponse>(indexName, json);
return response.ApiCall.Success;
}
public bool CreateIndex(字符串indexName,字符串json)
{
var response=_client.LowLevel.indiceCreate(indexName,json);
返回response.ApiCall.Success;
}
希望这能节省别人的时间 你使用哪种版本的NEST?我使用@mcating。我们使用的是Nest版本1.1.2。这在某些情况下是可行的,但我们的ElasticSearch实例是通过SSL和jetty进行保护的。对于我们来说,更好的答案是使用已经嵌入到ElasticClient实例中的连接细节,而不是创建一个HttpClient然后反向工程许可/连接细节。谢谢你的帮助@mcating没有任何不安全或需要使用直接HTTP调用的反向工程。这就是我们在所有系统中所做的(在Nginx后面)。与学习图书馆相比,重用现有的ES知识更容易。这并不是说只有在“某些情况下”才会起作用。这就是所有插件和扩展的方式,这就是我们使用curl与ES交互的方式,这就是您将通过NEST在线看到的方式。有关更多信息,请参阅我的内部文档。@DavidBetz:我关心的是概念性的。通过直接访问HttpClient,您可以了解到可能随时间而变化的实现细节。通过坚持使用ElasticClient,它在概念上封装了所有必需的连接细节,客户机对底层实现细节变得更具弹性。@mcating HTTP接口正是许多人(与MongoDB相比)的核心卖点。此外,这些是接口,而不是实现细节;这些是版本化的Web API。您的接口不是嵌套的,而是HTTP端点告诉您的接口。这是RESTful架构101。我希望看到NEST被弃用。你说得好像我们在谈论“内部”和“私人”成员。这些是我们应该鼓励人们使用的公共API。说真的,你没看过医生吗?它们是关于HTTP API的——它们不是“内部”或“实现细节”。@DavidBetz:我想我的措辞不清楚。“内部”和“反向工程”指的是我们在GetClient()中配置、实现和封装的自定义身份验证方案,它返回了一个完全可用的ElasticClient。切换到ElasticClient/HttpClient的混合模式将使库消费者感到困惑,并随着连接/配置/身份验证细节的发展而增加维护成本。我们决定使用NEST,因此有强烈的动机让所有客户使用同一个库。这个问题在这一点上为我解答了。谢谢你抽出时间_Elasticsearch 2.x中缺少client.Raw.IndicatiesCreatePost。现在是_client.LowLevel.indicatescreatepost