【问题标题】:Elasticsearch scroll api search "from"Elasticsearch 滚动 api 搜索“来自”
【发布时间】:2014-09-26 11:31:02
【问题描述】:

我有一个基于 url 索引 http://example.com/sitemap.index.xml 生成站点地图的脚本,其中 index 是一个数字 >0,它定义了每个块中应包含哪些结果。

$chunk = 10000;
$counter = 0;

$scroll = $es->search(array(
    "index" => "index",
    "type" => "type",
    "scroll" => "1m",
    "search_type" => "scan",
    "size" => 10,
    "from" => $chunk * ($index - 1)
));
$sid = $scroll['_scroll_id'];

while($counter < $chunk){
    $docs = $es->scroll(array(
        "scroll_id" => $sid,
        "scroll" => "1m"
    ));
    $sid = $docs['_scroll_id'];
    $counter += count($docs['hits']['hits']);
}

// ...

现在每次访问http://example.com/sitemap.1.xmlhttp://example.com/sitemap.2.xml ES 返回的结果都是一样的。它返回 50 结果(每个分片 10 个),但似乎没有计算 from = 0from = 10000

我使用elasticsearch-php 作为 ES 库。

有什么想法吗?

【问题讨论】:

  • 你的意思是说,每次迭代的结果都是一样的?
  • @Shastry,是的,无论from = ? 传递给初始search() 请求,结果都完全相同。
  • 我在 Java 中使用过扫描和滚动。但我没有陷入这种情况。可以给你java代码吗?
  • @Shastry,当然......你可以提出一个要点并将链接传递给我,我会看看。
  • 我将提供它作为答案。看看吧

标签: php xml elasticsearch


【解决方案1】:

在Java中,可以这样做

QueryBuilder query = QueryBuilders.matchAllQuery();
SearchResponse scrollResp = Constants.client.prepareSearch(index)
        .setTypes(type).setSearchType(SearchType.SCAN)
        .setScroll(new TimeValue(600000)).setQuery(query)
        .setSize(500).execute().actionGet();
while (true) {
    scrollResp = Constants.client
            .prepareSearchScroll(scrollResp.getScrollId())
            .setScroll(new TimeValue(600000)).execute().actionGet();
    System.out.println("Record count :"
            + scrollResp.getHits().getHits().length);
    total = total + scrollResp.getHits().getHits().length;
    System.out.println("Total record count: " + total);
    for (SearchHit hit : scrollResp.getHits()) {
    //handle the hit
    }
    // Break condition: No hits are returned
    if (scrollResp.getHits().getHits().length == 0) {
        System.out.println("All records are fetched");
        break;
    }
}

希望对你有帮助。

【讨论】:

  • 感谢您的回复,但我在您的搜索查询中没有看到 setFrom(?)。您的示例适用于返回特定 _type 的所有记录,但不能从中返回特定块。正如我最初的问题所说,我正在构建一个站点地图,所以我当然有文档大小和 url 数量的限制,因此我需要将我的所有站点地图拆分为较小的站点地图sitemap.1.xmlsitemap.2.xml。因此,对url/sitemap.1.xml 的每个请求都将返回第一个10000 命中,对于url/sitemap.2.xml,它将返回1000120000 之间的命中。
猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 2018-10-05
  • 2014-04-30
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多