【问题标题】:how to get all documents by index in Easticsearch using NEST?如何使用 NEST 在 Elasticsearch 中按索引获取所有文档?
【发布时间】:2023-04-07 20:38:01
【问题描述】:

我想通过索引获取我的所有文档。我尝试了以下方法:

var response = client.Search(s => s.Index("test").MatchAll());

响应返回“成功操作”,但它没有命中任何文档,尽管该索引下有许多文档。

【问题讨论】:

标签: elasticsearch nest


【解决方案1】:

要获取索引中的所有文档,您需要使用Scroll API。请注意,根据我们讨论的文档数量,您可能会通过多个 HTTP 请求/响应批量接收它们。

NEST 中有一个助手可以让这更容易,ScrollAll()

Time processTimePerScroll = "20s";
int numberOfSlices = Environment.ProcessorCount;

var scrollAllObservable = client.ScrollAll<Person>(processTimePerScroll, numberOfSlices, sc => sc
    .MaxDegreeOfParallelism(numberOfSlices)
    .Search(s => s
        .Query(q => q
            .MatchAll()
        )
    )
)

var waitHandle = new ManualResetEvent(false);
Exception exception = null;

var scrollAllObserver = new ScrollAllObserver<Person>(
    onNext: response => 
    {
        // do something with the documents
        var documents = response.SearchResponse.Documents;
    },
    onError: e =>
    {
        exception = e;
        waitHandle.Set();
    },
    onCompleted: () => waitHandle.Set()
);


scrollAllObservable.Subscribe(scrollAllObserver);

waitHandle.WaitOne();

if (exception != null) 
{
    throw exception;    
}

【讨论】:

  • 我想添加一个异步版本会很好。
  • @RussCam 如何设置 ScrollAll 参数:numberOfSlices、maxDegreeOfParallelism 和 size?在某些情况下,我看到 maxDegreeOfParallelism 被设置为 Environment.ProcessorCount 和 numberOfSlices 是它的两倍。它们应该如何计算?此外,它们是否应该以任何方式相关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多