ElasticSearch 批量索引

3
我正在使用版本2.1和2.0(alpha)客户端以及Nest C#客户端... 我试图批量插入一些记录,然而服务器返回了一个错误。我在Windows客户端上使用客户端与Linux服务器通信(但我认为这不应该有影响)。
    public static void AddQuestionsToElasticSearch()
    {
        var es = new ElasticsearchClient(new ConnectionConfiguration(
            new Uri("http://elasticserver:9200"))
        );

        var foobars = new FooBar().Parse();
        var descriptor = new BulkDescriptor();

        descriptor.CreateMany<FooBar>(foobars, (bd, q) => bd.Id(q.Id.ToString()).Index("foobars"));

        Console.WriteLine($"Inserting foobars into ES...");
        var sw = new Stopwatch();
        sw.Start();

        var result = es.Bulk<FooBar>(descriptor);

        sw.Stop();
        Console.WriteLine($"Finished inserting foobars {GetTimeTaken(sw.Elapsed)}");
    }

更新 - 错误信息

我遇到的错误在Bulk()方法返回的响应中... BulkResponse返回的两个属性是:

OriginalException: "远程服务器返回了一个错误:(400) 错误请求"

ServerError.Error: "验证失败:1:没有添加请求"


更新的问题,带有错误。 - bbqchickenrobot
你确定 new FooBar().Parse(); 实际上会返回任何项吗? - Rob
是的,它确实返回有效数据...要模拟数据源,只需新建[] {new FooBar(),new FooBar(),....}; - bbqchickenrobot
1个回答

5
您犯了一个简单的错误 - 您使用了Elasticsearch.Net中的低级别ElasticsearchClient来发出请求,但发送了一个来自NEST的强类型批量请求。要纠正这个错误很简单,您只需使用NEST中的ElasticClient即可。
public static void AddQuestionsToElasticSearch()
{
    var es = new ElasticClient(new Uri("http://elasticserver:9200"));

    var foobars = new FooBar().Parse();
    var descriptor = new BulkDescriptor();

    descriptor.CreateMany<FooBar>(foobars, (bd, q) => bd.Id(q.Id.ToString()).Index("foobars"));

    Console.WriteLine($"Inserting foobars into ES...");
    var sw = new Stopwatch();
    sw.Start();

    var result = es.Bulk(descriptor);

    sw.Stop();
    Console.WriteLine($"Finished inserting foobars {GetTimeTaken(sw.Elapsed)}");
}
< p > NEST 中的 ElasticClient 是高级客户端,它在内部使用来自 Elasticsearch.NetElasticsearchClient


谢谢@Russ - 我现在会尝试。我是ES的新手,请原谅我,但我有另一个小问题 - 我应该使用CreateMany<>()还是IndexMany()?从文档中无法区分(可能错过了一些)。 - bbqchickenrobot
4
如果索引中已经存在与Id和类型相同的文档,那么任何单个创建调用都将导致CreateMany<T>()失败,而IndexMany<T>将插入该文档或覆盖具有相同类型和Id的现有文档(除非您已指定类型,否则它将从T中推断出)。 实质上,CreateMany<T>在希望利用乐观并发控制的情况下很有用。请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html - Russ Cam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接