搜尋的最佳作法

此文件推薦了搜尋 API 的最佳做法,我們使用單引號 (‘’) 來區隔查詢字串。包含在雙引號內的多字詞組查詢即可明確分隔,不致混淆:‘field:"some text" some-value’

批次 Index.put() 與 Index.delete() 的呼叫

從索引新增或刪除文件時,一次最多可傳送 200 個文件。這會比一次處理所有檔案還要有效率。

使用文件排名對文件進行預排序

在預設情況下,搜尋會以遞減排名排序傳回結果。此外在預設情況下,自 2011 年 1 月 1 日起,搜尋 API 會將每個文件排名設定為秒。此會先傳回最新的檔案。但是,若您不需要在新增文件時對文件進行排序,則可以將排名用於其他目的。假設您擁有一個房地產應用程式,客戶最希望的就是以價格來排序搜尋結果。為了能夠在預設情況下有效地排序,您應對房屋價格進行排名。

若您需要多種排序順序,例如價格由低至高、價格由高至低,您可以為每個順序建立一個獨立的索引。其中一個索引為 rank = price,且另一個為索引為 rank = MAXINT-price (因為排名必須為正數)。

使用排名作為排序金鑰可以提高搜尋效能。若要指定其他排序金鑰,您必須使用排序選項,將搜尋結果的數量設定限制為 10,000 個文件。在這種情況下,依據排名的排序順序將決定哪些文件會包含在排序中。詳情請參閱排序選項

將布林資料用於 atom 欄位

在數字欄位儲存布林資料是非常沒有效率的。請改為使用 atom 欄位,並指派您希望使用的常數 (True/False、Yes/No、0/1)。

將否定搜尋轉變為正面搜尋

假設您有特殊的術語能夠辨識未知料理的餐廳,若需排除這些餐廳,您可以使用 ‘NOT cuisine:undefined’ 做為您的查詢。然而,不管在計費的運算或是計算的時間上,如此花費的成本都比相反的評估方式 (找到已知料理的餐廳) 來得更高。您可以使用兩個欄位,分別為 cuisinecuisine_known,且後者使用 atom 欄位,而非只使用一個「cuisine (料理)」的欄位。對於已知料理的餐廳,您可以將第一個欄位設定為實際的料理名稱,第二個欄位設定為 "yes"。對於未知料理的餐廳,您可以將料理欄位設定為 "" (空字串) 且 cuisine_known 設定為 "no"。現在若您想要找到已知料理的餐廳,請進行一個查詢 ‘cuisine_known:yes’,這會比否定的查詢更快速。

將分離詞轉變為連詞

「OR」分離詞在計費的運算與計算的時間上皆為高成本作業。假設您要搜尋 ‘cuisine:Japanese OR cuisine:Korean’,替代方法是對較籠統的料理類別文件進行索引。在這種情況下,查詢可以簡化為 ‘cuisine:Asian’

消除搜尋中的重言式 (套套邏輯)

假設您要搜尋多倫多的所有餐廳,且假設所有文件僅有一個「city」欄位,若您使用 ‘city:toronto AND NOT city:montreal’ 查詢,會取得與 ‘city:toronto’ 查詢相同的結果,因為一旦您將城市設定為 "toronto",就不能設定為 "montreal"。第二個查詢執行得更快,因為它只涉及一個術語。第一個查詢執行三個步驟:首先它會找到所有城市為多倫多的文件清單,並找到所有非將城市設定為蒙特婁的所有城市清單,最後計算這兩個清單的交集。

在排序之前縮小範圍

假設您的應用程式儲存了全世界的餐廳資訊,且您希望顯示最接近當前使用者的餐廳。其中一種方法是依據當前使用者位置與餐廳的距離,對相符的文件進行排序。但是若您有 1,000,000 間餐廳,且使用排序表達距離 (geopoint(x, y), restaurant_loc) 執行像是 ‘cuisine:japanese’ 的查詢,這查詢會花費很長的時間。建議您為查詢新增篩選器,如此您就可以從選定的文件中挑出重要部分以進行排序。有一種解決方案是建立一個地理類別,例如國家、州、和城市,您就可以從使用的位置推測城市和州。然後您的查詢會變成 ‘cuisine:japanese AND city:<user-city>’。您就不需要再對 1,000,000 個文件進行排序。

使用縮小的範圍以避免或最小化排序作業

若您使用排名並依據價格排序餐廳,您可以建立一個 price_range 欄位,且包含以下這些價格類別:price_0_10price_11_20price_21_30price_31_40price_41_lots。然後您可以使用查詢 ‘price_range:price_21_30 OR price_range:price_31_40’ 以無排序方式搜尋價格介於 21 美元到 40 美元之間的所有餐廳。在許多情況下,可能無法明確分出適合的類別,但是使用這項技術,您可以在從昂貴的查詢 (例如 ‘... AND price>25 AND price<35’) 做精選前,先行拒絕大量的文件。

除非需要,否則請不要對相符性進行評分

評分的用意是指出特定文件與查詢的相符程度。但是除非您打算依評分進行排序,否則請勿要求評分。這會減慢您的搜尋速度。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境