2014-09-26 104 views
1

我有一个基于URL的索引http://example.com/sitemap.index.xml其中index是一个数字>0定义什么结果应包括在每个块生成网站地图的脚本。Elasticsearch滚动API搜索“从”

$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 = 0,from = 10000

我使用elasticsearch-php作为ES库。

任何想法?

+0

你的意思是说,对于每一次迭代,重做的结果是一样的吗? – Shastry 2014-09-26 12:15:34

+0

@Shastry,是的,无论'from =?'传递给最初的'search()'请求,结果都是一样的。 – 2014-09-26 12:19:12

+0

我已经在Java中使用了扫描和滚动。但我没有进入这种情况。我可以为你提供Java代码吗? – Shastry 2014-09-26 12:27:33

回答

0

在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; 
    } 
} 

希望它能帮助来完成。

+0

谢谢你的回复,但我没有请参阅搜索查询中的'setFrom(?)'。你的例子适用于返回特定'_type'的所有记录,但不是来自它的特定块。正如我原来的问题所说,我正在构建一个站点地图,所以我偏离了文档大小和URL数量的限制,因此我需要将所有站点地图分割为更小的站点地图'sitemap.1.xml','sitemap.2。 xml'。因此,每个对“url/sitemap.1.xml”的请求都将返回第一个“10000”匹配,对于“url/sitemap.2.xml”,它会返回匹配在“10001”和“20000”之间的匹配。 – 2014-09-26 12:52:53