c# - NEST 的方法 IndexMany 同步运行

标签 c# elasticsearch nest

我在使用 NEST 的方法 IndexMany(批量索引)时遇到了一个小问题。我发现当我将一些项目发送到 elasticsearch 进行索引时,立即返回响应,但此时并非所有文档都被索引。

问题可以很容易地显示在以下代码中:

List<object> objectToIndex = new List<object>(); // assume 3000 items here
ElasticClient client = new ElasticClient(settings);
client.IndexMany(objectsToIndex, indexName, type);

var readResult = client.Search<T>(e => e
    .Type(type)
    .Index(indexName)
    .Query(q => q
        .Range(r => r.OnField(t => t.Date).GreaterOrEquals(dates[0]).LowerOrEquals(dates[1]))
    )
);
// read result contains only 300-500 items

System.Threading.Thread.Sleep(2000);

readResult = client.Search<T>(e => e
    .Type(type)
    .Index(indexName)
    .Query(q => q
        .Range(r => r.OnField(t => t.Date).GreaterOrEquals(dates[0]).LowerOrEquals(dates[1]))
    )
);
// readResult contains all 3000 items right now

这对我来说是个问题,因为我需要批量索引所有文档,然后全部阅读。当然,我可以在批量索引之后运行 Thread.Sleep(..),但这不是我的解决方案。

Elasticsearch版本为2.2.0,NEST客户端版本为1.7.2。

那么,有没有办法强制 elastic/NEST 等到所有文档都被索引后再继续?

最佳答案

NEST 2.x is not compatible with Elasticsearch 1.x ;虽然它可能在大多数情况下都有效,但它尚未针对 1.x 进行测试,并且 Elasticsearch 1.x 和 2.x 之间存在重大变化,这些变化反射(reflect)在 NEST 的变化中,例如,服务器错误响应,这将导致运行时的序列化异常。您应该将最新的 NEST/Elasticsearch.Net 1.x ( currently 1.8.0 ) 与 Elasticsearch 1.x 一起使用。

这里需要在索引率和允许新索引的项目可用于搜索之间做出权衡。通过将刷新间隔从 1 秒更改为更长的时间(例如 30 秒),或者在编制索引 (-1) 时完全禁用它,然后在完成后设置回 1 秒,您可能会看到更好的索引率,但需要等待为可供搜索的文档编制索引后的时间更长。相比之下,如果尽快将项目编入索引以供搜索更为重要,那么您可以发送较小的批量大小并在请求中调用刷新,例如

client.Bulk(b => b
    .CreateMany(objectToIndex, (c, doc) => c
        .Document(doc)
        .Type(type)
        .Index(indexName)
    )
    .Refresh()
);

需要注意的是,更频繁地调用刷新可能会增加集群的负载,并且索引将花费更长的时间。

如果您绝对必须等到所有文档都已编制索引,我建议您对搜索进行计数,以减少需要反序列化的响应的大小

var countResponse = client.Count<MyClass>(c => c
    .Type(type)
    .Index(indexName)
        .Query(q => q
            .Range(r => r
                .OnField(t => t.Date)
                .GreaterOrEquals(dates[0])
                .LowerOrEquals(dates[1])
            )
        )
    );

var count = countResponse.Count;

关于c# - NEST 的方法 IndexMany 同步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37115233/

相关文章:

c# - 如何将嵌入式 list 移动到外部 .manifest 文件?

elasticsearch - 在 3 节点 Elasticsearch 集群中,搜索分布在所有节点上?

c# - 从应用程序域中删除程序集

c# - 如何在c#中动态添加文本到span控件

elasticsearch - 如何聚合直到在 ElasticSearch 中达到某个值?

php - Elasticsearch 中参数为空或空时如何忽略查询约束

c# - 如何获取Elasticsearch评分结果详细信息?

asp.net - 带有 NEST 查询问题的 ElasticSearch

c# - ElasticSearch NEST searchresponse.hits 数据未填充

c# - GroupByUntilChanged : is there a LINQ GroupBy operator that groups by SUCCESSIVE equal keys?