【问题标题】:Scan and Scroll Substitute in ElasticSearch version 2.x (NEST C#)ElasticSearch 版本 2.x (NEST C#) 中的扫描和滚动替换
【发布时间】:2016-04-21 13:21:20
【问题描述】:

我已成功使用 Elastic 1.x scan and scroll 和 NEST API 来获取与我的查询匹配的所有文档。开始了一个新项目,并认为我将使用最新的 Elastic 版本 2.x,并偶然发现了第一个障碍 - 我如何返回所有匹配查询的文档(在 c# 中使用 NEST)?

感谢任何建议, 谢谢

【问题讨论】:

  • This github issue 似乎表明滚动仍然存在并且需要以相同的方式使用。

标签: c# .net elasticsearch nest


【解决方案1】:

Scroll 在 Elasticsearch 2.x 中

同步版本

var response = client.Search<object>(s => s
    // specify a scroll time of 2 minutes using string,
    // implicitly converts to Time type
    .Scroll("2m")
    .Sort(ss => ss
        // sorting on "_doc"
        .Ascending(SortSpecialField.DocumentIndexOrder)
    )
);

异步版本

var response = await client.SearchAsync<object>(s => s
    // specify a scroll time of 2 minutes using Time type
    .Scroll(new Time(2, Nest.TimeUnit.Minute))
    .Sort(ss => ss
         // sorting on "_doc"
        .Ascending(SortSpecialField.DocumentIndexOrder)
    )
);

有关Time units的更多信息

【讨论】:

  • 如何通过一次扫描查询获取所有文档?有可能吗?在上面添加的 url 中说“滚动 API 可用于从单个搜索请求中检索大量结果(甚至所有结果)”.. 但是如何?我想不通。当我定义大于 1000 的大小时,它将作为搜索查询返回错误。谢谢
  • @batmaci 滚动是获得大量结果的好方法,但是您不会在一个请求中获得所有结果 ;您需要每次使用与上一组结果一起返回的scroll_id 请求下一组结果。将scroll_id 视为只进、只读、光标悬停在结果集上
  • 如果我扫描包含大约 100k 个文档的整个索引,是否会对索引或分片造成任何性能影响?当我执行大小为 10k 的滚动查询时,我可以看到它很慢。如果在我的网站上使用相同索引进行搜索,我是否应该担心性能。我读到内存使用率很高,但我不确定。
  • 在性能方面需要考虑很多因素,例如负载、硬件等,因此很难在此处提供明确的答案。滚动查询的大小是 每个分片 的文档数,因此请记住这一点。我会对几种不同的尺寸进行基准测试,看看哪种尺寸最适合您的情况。在_doc 上滚动排序将是检索所有文档的最佳执行方式
【解决方案2】:

我不是 NEST 用户,但是在 ES 2.X 中完成扫描和滚动查询的方式发生了变化。现在,您可以使用基于 _doc 的简单排序查询进行扫描和滚动。请参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

curl -XGET 'localhost:9200/_search?scroll=1m' -d '
{
  "sort": [
    "_doc"
  ]
}
'

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多