Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ElasticSearch嵌套:通过指定json通过ElasticClient创建索引_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# ElasticSearch嵌套:通过指定json通过ElasticClient创建索引

C# ElasticSearch嵌套:通过指定json通过ElasticClient创建索引,c#,elasticsearch,nest,C#,elasticsearch,Nest,我们允许客户端在创建索引时定义自定义分析器。我们更愿意在json中指定这一点,以便通过底层的ElasticSearch文档提供最大的灵活性和可理解性 我想使用json字符串中定义的分析器、映射器等的任意描述创建一个索引。凭感觉,我的命令是 PUT /my_index { "settings": { "analysis": { "char_filter" : { "

我们允许客户端在创建索引时定义自定义分析器。我们更愿意在json中指定这一点,以便通过底层的ElasticSearch文档提供最大的灵活性和可理解性

我想使用json字符串中定义的分析器、映射器等的任意描述创建一个索引。凭感觉,我的命令是

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库版本中的函数

我可以想象的选项包括:

  • 以某种方式使用ElasticClient.Raw.IndicateScreatePost或类似的东西
  • 通过IndexSettings Converter.ReadJson()将json字符串反序列化为IndexSettings对象,然后通过ElasticClient.CreateIndex(ICreateIndexRequest)应用该字符串
  • 这两种机制的文档都非常少

    我绝对不想使用CreateIndex的lambda函数版本,因为将用户的json翻译成lamdba表达式会很痛苦,但却会立即将它们翻译回嵌套深处的json


    非常感谢上述#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