2016-07-22 18 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

相關問題