6

我有一个查询返回来自分布在我们集群中的 7 个不同索引的约 20 万次点击。我将我的结果处理为:

while (true) {
    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet();

    for (SearchHit hit : scrollResp.getHits()){
            //process hit}

    //Break condition: No hits are returned
    if (scrollResp.hits().hits().length == 0) {
        break;
    }
}

我注意到在返回下一组搜索命中之前,client.prepareSearchScroll 行可能会挂起相当长的时间。我运行代码的时间越长,这似乎越糟。

我的搜索设置是:

SearchRequestBuilder searchBuilder = client.prepareSearch( index_names )
    .setSearchType(SearchType.SCAN)
    .setScroll(new TimeValue(60000)) //TimeValue?
    .setQuery( qb )
    .setFrom(0) //?
    .setSize(5000); //number of jsons to get in each search, what should it be? I have no idea.
    SearchResponse scrollResp = searchBuilder.execute().actionGet();

在检查许多结果时,是否预计扫描和滚动只需要很长时间?我对 Elastic Search 很陌生,所以请记住,我可能遗漏了一些非常明显的东西。

我的查询:

QueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("tweet", interesting_words));
4

4 回答 4

8

.setSize(5000)意味着每次client.prepareSearchScroll调用将检索每个分片 5000 条记录。您正在请求回溯源,如果您的记录很大,在内存中组装 5000 条记录可能需要一段时间。我建议尝试一个较小的数字。尝试 100 和 10 看看您是否获得了更好的性能。

.setFrom(0)没有必要。

于 2012-11-20T20:17:09.220 回答
7

我将在这里添加另一个答案,因为我对这种行为感到非常困惑,我花了很长时间才在@AaronM 的评论中找到答案

这适用于 ES 1.7.2,使用 java API。

我正在滚动/扫描 500m 记录的索引,但查询返回大约 400k 行。

我开始时滚动大小为 1,000,在我看来,这在网络与 CPU 方面是一个合理的权衡。

这个查询运行得非常慢,大约需要 30 分钟才能完成,在从游标提取之间有很长的停顿。

我担心这可能只是我正在运行的查询,并且不相信减小滚动大小会有所帮助,因为 1000 看起来很小。

但是,看到上面 AaronM 的评论,我尝试了 10 的滚动大小。

整个工作在 30 秒内完成(这是我是否重新启动了 ES,所以大概与缓存无关) - 加速约 60 倍!

因此,如果您在滚动/扫描方面遇到性能问题,我强烈建议您尝试减小滚动大小。我在互联网上找不到太多关于这个的信息,所以在这里发布了这个。

于 2016-07-22T20:42:11.720 回答
2
  • 查询数据节点不是客户端节点或主节点
  • 选择您需要的filter_path属性字段
  • 根据您的文档大小设置滚动大小,没有神奇的规则,您必须设置值并尝试,等等
  • 监控您的网络带宽
  • 如果这还不够,让我们去找一些多线程的东西:

认为elasticsearch索引是由多个分片组成的。这种设计意味着您可以并行化操作。

假设您的索引有 3 个分片,并且您的集群有 3 个节点(按索引拥有比分片更多的节点的好习惯)。

您可以在每个单独的线程中运行 3 个 Java“工作者”,它们将搜索滚动不同的分片和节点,并使用队列来“集中”结果。

这样,您将有一个很好的表现!

这就是 elasticsearch-hadoop 库的作用。

要检索有关索引的分片/节点详细信息,请使用https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html API。

于 2016-10-13T12:43:03.977 回答
-1

你可以在这里阅读文档

搜索滚动请求生成器

我认为 Timevalue 是时候让滚动保持活力了

setScroll(TimeValue keepAlive)

如果设置,将启用指定超时的搜索请求滚动。

你可以在这里阅读更多 :

滚动

于 2015-09-11T09:12:17.043 回答