如何在弹性搜索的单击中使用匹配查询获取所有数据

时间:2016-07-22 08:05:51

标签: php elasticsearch

我正在使用PHP elasticsearch客户端,并使用以下代码从elasticsearch获取所有匹配的数据。

$sponsorSearch['index'] = 'sponsors';
$sponsorSearch['type'] = 'couchbaseDocument';
$sponsorSearch['body']['query']['bool']['must'][]['match']['eventid'] = $EventID;
$sponsorSearch['body']['query']['bool']['must'][]['match']['paystatus'] = "complete";
$sponsorCount = $client->count($sponsorSearch);
if($sponsorCount['count']>0) {
   $sponsorSearch['from'] = 0;
   $sponsorSearch['size'] = $sponsorCount['count'];
   $sponsorResponse = $client->search($sponsorSearch);
}

但它使用了两个命中弹性搜索,一个用于计算文档的数量,另一个用于获取文档。我只想在一次点击中执行此操作。

2 个答案:

答案 0 :(得分:1)

如果你有超过10个文件(但是比10000更少),你只需在查询中指定一个大于10的文件,并且只进行搜索(即没有计数查询):

$sponsorSearch['index'] = 'sponsors';
$sponsorSearch['type'] = 'couchbaseDocument';
$sponsorSearch['size'] = 1000;
$sponsorSearch['body']['query']['bool']['must'][]['match']['eventid'] = $EventID;
$sponsorSearch['body']['query']['bool']['must'][]['match']['paystatus'] = "complete";
$sponsorResponse = $client->search($sponsorSearch);

答案 1 :(得分:1)

一次性获取所有点击数量的实际应用数量非常少,并且由于弹性搜索的分布式特性,如果有数万个结果需要很长时间。我建议你评估为什么要做到这一点以及是否有任何可能的选择。

虽然如果你仍然想要出于某些原因得到所有结果,那么除了你现在正在做的事情之外,只有一种方法是使用滚动API。我不确定php API是如何工作的,但你可以看看here

我看到你唯一不太热衷的另一个解决方案就是设置一个像百万的荒谬高的大小。默认情况下,结果大小限制为10000,但您可以在配置中更改此限制。 另外请记住,只要有1k-2k的结果,这就可以正常工作,但随着结果数量的增加,获得所有结果的效率会越来越低。

另外,请看一下在弹性搜索中如何完成pagination,以了解事情是如何运作的。