搜尋的最佳做法

本文件說明 Search API 的最佳做法。我們會使用單引號 ('') 來分隔查詢字串。這樣一來,您就能輕鬆分辨以雙引號區隔多字詞組的查詢作業,而不致混淆:'field:"some text" some-value'

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

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

使用文件排名將文件預先排序

搜尋作業預設會依遞減排名傳回結果。此外根據預設,Search API 會將每個文件的排名設定為從 2011 年 1 月 1 日開始的秒數。如此會先傳回最新的文件。不過,如果您不需要在新增文件時對其進行排序,則可以將排名用於其他目的。假設您有一個房地產應用程式,而客戶最想要的是按價格排序。為了獲得有效率的預設排序,您可以將排名設定為房價。

如果您需要多種排序順序,例如價格從低到高和價格從高到低,可以為每個順序建立不同的索引。其中一個索引為 rank = price,而另一個索引為 rank = MAXINT-price (因為排名必須為正數)。

使用排名做為排序索引鍵可以提高搜尋效能。如要指定其他排序索引鍵,您必須使用排序選項,將搜尋結果的數量限制為 10,000 個文件。在這種情況下,由排名決定的排序順序將會決定哪些文件將會包含在排序中。詳情請參閱排序選項的說明。

將 Atom 欄位用於布林資料

將布林資料儲存在數字欄位中會非常沒有效率。請改為使用 Atom 欄位,並指派您希望使用的常數 (True/False、yes/no、0/1)。

將否定搜尋改為正向搜尋

假設您有一個特殊字詞可識別未定義料理的餐廳。如果要排除這些餐廳,您可以使用 'NOT cuisine:undefined' 做為查詢。但是,這樣做所花的成本 (在計費作業和計算時間這兩方面) 比相反的評估方式 (尋找料理已知的餐廳) 高很多。因此,您可以使用 cuisinecuisine_known 兩個欄位,且後者為 Atom 欄位,而非只使用一個 cuisine 欄位。對於已定義料理的餐廳,您可以將第一個欄位設定為實際的料理名稱,第二個欄位則設定為 "yes"。對於您不知道其料理的餐廳,可以將 cuisine 欄位設定為 "" (空字串),並將 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"。第二個查詢的執行速度會快很多,因為它只涉及一個字詞。第一個查詢會執行三個步驟:首先它會尋找將城市設定為「toronto」的文件清單,然後尋找城市不是設定為「montreal」的所有城市清單,最後計算這兩個清單的交集。

在排序之前先縮小範圍

假設您的應用程式儲存了全世界的餐廳資訊,而且您想要顯示離目前的使用者最近的餐廳。其中一種方法是依使用者的位置與餐廳之間的距離將相符的文件排序。但是如果您有 1,000,000 家餐廳,則執行像 'cuisine:japanese' 這樣的查詢並使用排序運算式 distance(geopoint(x, y), restaurant_loc),將需要很長的時間。建議您在查詢中加入篩選器,如此就可以從一組較重要的選定文件開始排序。有一個解決方案是建立地理類別 (例如國家、州和城市),這樣您就可以從使用者的位置推論城市和州。然後您的查詢會變成 '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') 進行精選。

除非需要,否則不要對相符項目進行評分

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