c# - 使用 ElasticLowLevelClient 客户端在 Elasticssearch 中批量索引

标签 c# elasticsearch nest bulk

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

client.Index<object>(indexName, message.MessageType, message.Id, 
    new Elasticsearch.Net.PostData<object>(message.MessageJson));

如何使用 ElasticLowLevelClient 客户端批量插入索引?批量插入 API 都需要索引文档的 POCO,但我没有,例如:

 ElasticsearchResponse<T> Bulk<T>(string index, PostData<object> body,
      Func<BulkRequestParameters, BulkRequestParameters> 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");

发送以下批量请求

POST http://localhost:9200/_bulk
{"index":{"_index":"my-index","_type":"foo","_id":"1"}}
{"name":"message 1","content":"foo"}
{"index":{"_index":"my-index","_type":"bar","_id":"2"}}
{"name":"message 2","content":"bar"}

几个要点

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

关于c# - 使用 ElasticLowLevelClient 客户端在 Elasticssearch 中批量索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48754597/

相关文章:

c# - 如何将用户与数据层应用程序中的角色相关联

java - Elasticsearch如何在aggs下获取过滤器的doc_count值?

elasticsearch - 如何使用主管在 docker 容器上运行 elasticsearch?

c# - Elasticsearch 错误 "failed to find nested object under path"

c# - Elasticsearch 在使用 IndexMany 时推断动态类型的 _id

c# - 为什么 c# 上的 paypal 开发人员说明在 github 上不同?

c# - 如何在 MVC Core 中将 JS/CSS Cdn 添加到网站中?

c# - Scaffold-DbContext 在.net core 中抛出错误 "Could not find assembly"

elasticsearch - 有没有一种方法可以直接将数据发送到elasticsearch而不使用filebeats和logstash?

c# - 具有不同类型的Elasticsearch map 属性