2016-07-22 109 views
2

我正在使用PHP elasticsearch客户端,并使用以下代码从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); 
} 

但它使用两个命中elasticsearch,一个用于计数的文件数量等是获取的文件。我只想在单击时执行此操作。

+0

您只想从索引中获得所有结果?我们在谈论多少文件? – Val

+0

我的索引中有超过10个匹配的文档,我想在单个匹配中检索所有匹配的文档 –

回答

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); 
+0

但是据我们所知,我们不应该硬编码大小参数,假设我们的记录少于1000条并不是好的在很多情况下,它可能会超过 –

+0

如果你的文档较少,那么它就没有任何影响,那么这将不会有任何影响......你只是告诉ES“给我所有的文档都符合我的标准想要得到计数或分页结果,请相信我我不会让你失望“ – Val

+0

感谢@Val,我使用了这个,但是我认为在有更多文档之后,它会导致错误 –

1

一次获得所有匹配的实际应用数量非常少,如果由于elasticsearch的分布式特性而导致数以万计的结果非常低效且需要很长时间。我建议你评估你为什么要这样做,如果有任何可能的选择。

虽然如果您仍然想要得到所有结果,但由于某种原因,您现在正在做的只是使用滚动API。我不确定php API的工作原理,但你可以看看here

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

另请参阅pagination在elasticsearch中完成的工作,以了解事物如何在底层工作。

+0

他的“要求”是让所有的文档都处于“一击”状态,这样就排除了分页和扫描/滚动,不幸的是,尽管这是正确的做法。 – Val

+0

在这种情况下,就像我说的那样,在elasticsearch中做这件事的唯一方法是设置一个非常高的尺寸(远大于您期望在索引中的文档数量)。 – adityasinghraghav

+0

我现在明白问题是什么,将编辑答案。 – adityasinghraghav

相关问题