elasticsearch,nest,bulk,C#,elasticsearch,Nest,Bulk" /> elasticsearch,nest,bulk,C#,elasticsearch,Nest,Bulk" />

C# Elasticssearch中的批量索引使用ElasticLowLevel客户端

C# Elasticssearch中的批量索引使用ElasticLowLevel客户端,c#,elasticsearch,nest,bulk,C#,elasticsearch,Nest,Bulk,我正在使用ElasticLowLevel客户端对elasticsearch数据进行索引,因为它需要作为原始字符串进行索引,因为我没有访问POCO对象的权限。我可以通过调用以下命令成功索引单个对象: client.Index<object>(indexName, message.MessageType, message.Id, new Elasticsearch.Net.PostData<object>(message.MessageJson)); client

我正在使用ElasticLowLevel客户端对elasticsearch数据进行索引,因为它需要作为原始字符串进行索引,因为我没有访问POCO对象的权限。我可以通过调用以下命令成功索引单个对象:

client.Index<object>(indexName, message.MessageType, message.Id, 
    new Elasticsearch.Net.PostData<object>(message.MessageJson));
client.Index(indexName、message.MessageType、message.Id、,
新的Elasticsearch.Net.PostData(message.MessageJson));
如何使用ElasticLowLevel客户端向索引中进行批量插入?批量插入API都需要索引文档的POCO,但我没有,例如:

 ElasticsearchResponse<T> Bulk<T>(string index, PostData<object> body,
      Func<BulkRequestParameters, BulkRequestParameters> requestParameters = null)
ElasticsearchResponse批量(字符串索引、PostData正文、,
Func requestParameters=null)

我可以为每个对象并行调用API,但这似乎效率低下。

低级客户端泛型类型参数是预期响应的类型

如果您使用的是高级客户机上公开的低级客户机,那么通过
.LowLevel
属性,您可以发送一个批量请求,其中您的文档是JSON字符串,如5.x中所示

var client = new ElasticClient(settings);


var messages = new [] 
{
    new Message 
    { 
        Id = "1", 
        MessageType = "foo", 
        MessageJson = "{\"name\":\"message 1\",\"content\":\"foo\"}" 
    },  
    new Message 
    { 
        Id = "2", 
        MessageType = "bar", 
        MessageJson = "{\"name\":\"message 2\",\"content\":\"bar\"}" 
    }   
};

var indexName = "my-index";

var bulkRequest = messages.SelectMany(m => 
    new[]
    {
        client.Serializer.SerializeToString(new
            {
                index = new
                {
                    _index = indexName,
                    _type = m.MessageType,
                    _id = m.Id
                }
            }, SerializationFormatting.None),
        m.MessageJson
    });

var bulkResponse = client.LowLevel.Bulk<BulkResponse>(string.Join("\n", bulkRequest) + "\n");
几个要点

  • 我们需要自己构建批量请求以使用低级批量API调用。由于我们的文档已经是字符串,因此构建字符串请求是有意义的
  • 我们序列化了一个匿名类型,每个批量项的操作和元数据都没有缩进
  • MessageJson
    不能包含任何换行符,因为这将破坏批量API;换行符是正文中json对象的分隔符
  • 因为我们使用的是在高级客户机上公开的低级客户机,所以我们仍然可以利用高级请求、响应和序列化程序。批量请求返回一个
    BulkResponse
    ,在使用高级客户端发送批量请求时,您可以像通常那样使用它

  • 低级客户端泛型类型参数是预期响应的类型

    如果您使用的是高级客户机上公开的低级客户机,那么通过
    .LowLevel
    属性,您可以发送一个批量请求,其中您的文档是JSON字符串,如5.x中所示

    var client = new ElasticClient(settings);
    
    
    var messages = new [] 
    {
        new Message 
        { 
            Id = "1", 
            MessageType = "foo", 
            MessageJson = "{\"name\":\"message 1\",\"content\":\"foo\"}" 
        },  
        new Message 
        { 
            Id = "2", 
            MessageType = "bar", 
            MessageJson = "{\"name\":\"message 2\",\"content\":\"bar\"}" 
        }   
    };
    
    var indexName = "my-index";
    
    var bulkRequest = messages.SelectMany(m => 
        new[]
        {
            client.Serializer.SerializeToString(new
                {
                    index = new
                    {
                        _index = indexName,
                        _type = m.MessageType,
                        _id = m.Id
                    }
                }, SerializationFormatting.None),
            m.MessageJson
        });
    
    var bulkResponse = client.LowLevel.Bulk<BulkResponse>(string.Join("\n", bulkRequest) + "\n");
    
    几个要点

  • 我们需要自己构建批量请求以使用低级批量API调用。由于我们的文档已经是字符串,因此构建字符串请求是有意义的
  • 我们序列化了一个匿名类型,每个批量项的操作和元数据都没有缩进
  • MessageJson
    不能包含任何换行符,因为这将破坏批量API;换行符是正文中json对象的分隔符
  • 因为我们使用的是在高级客户机上公开的低级客户机,所以我们仍然可以利用高级请求、响应和序列化程序。批量请求返回一个
    BulkResponse
    ,在使用高级客户端发送批量请求时,您可以像通常那样使用它

  • 太棒了,我刚试过,效果不错!谢谢你非常详细的回复,也谢谢你描述批量索引过程和相关点的附加点。太棒了,我刚刚试过,效果不错!感谢您非常详细的回复,以及描述批量索引过程和相关要点的其他要点。