若只使用查詢字串呼叫 
search() 方法,系統會根據預設的查詢選項傳回結果:
- 以遞減順序排序傳回文件
- 一次以 20 件為一組傳回文件
- 擷取的文件包含其原始欄位
您可以使用 Query 類別的執行個體做為 search() 的引數,以變更這些選項。
Query 類別可用於指定一次傳回多少文件,也可以讓您自訂所擷取文件的內容。您可以要求只傳回文件 ID,或要求文件只包含欄位子集。您也可以在擷取的文件中建立自訂欄位:文字片段 (文字欄位片段,顯示相符字串周圍的文字),以及欄位運算式 (欄位值會從文件中的其他欄位衍生)。
除了查詢選項外,Query 類別也可以包含 SortOptions 類別的執行個體。使用排序選項可以變更排序順序,也可以依多個索引鍵排序結果。
使用 Query 類別搜尋
使用 Query 類別的執行個體搜尋時,需分為數個步驟建構該類別的執行個體。一般順序如下:
- 建立查詢字串。
- 視需要建立 SortOptions。
- 建立 QueryOptions。
- 建立一個包含查詢字串與 (可選) QueryOptions的 Query 物件。
- 對該 Query 物件呼叫搜尋方法。
QueryOptions 和 SortOptions 建構函式使用具名引數,如以下範例所示:
QueryOptions
這些屬性控制傳回結果的數量及順序。偏移選項和游標選項 (兩者互斥) 支援分頁。 用於指定結果中要傳回哪些選定的文件。
| 屬性 | 說明 | 預設 | 上限 | 
|---|---|---|---|
| limit | 結果中傳回的文件數量上限。 | 20 | 1000 | 
| number_found_accuracy | 此屬性決定 SearchResults.number_found()傳回結果的準確率。會針對實際列入計算的符合結果數量設限,達到上限即停止搜尋。若索引中符合的數量少於或等於上限,則會傳回確切的數目。若非如此,傳回的數目會是估計值,依據找到的符合結果,以及索引的大小與結構而定。請注意,此屬性的值越高,越易影響搜尋作業的複雜程度,可能會導致逾時。 | 如果未指定或設為 None,準確率的設定值會與limit的值相同 | 25000 | 
| offset | 要傳回的第一份文件在結果中的偏移量。 | 0。結果將包含所有符合的文件 (不超過上限) | 1,000 | 
| cursor | 可使用游標取代偏移量,用於擷取一組組經過排序的文件。將游標傳入及傳出連續查詢時會更新游標,每次重新查詢時,都會從上一頁的結尾處往下接著進行。關於游標和偏移的討論,請參閱處理結果頁面。 | 空值。結果將包含所有符合的文件 (不超過上限) | - | 
| sort_options | 設定 SortOptions物件,用於控制搜尋結果的排序方式。SortOptions的執行個體自有一組屬性,如下所述。 | 空值。以遞減順序排序文件。 | - | 
這些屬性控制結果中顯示的文件欄位。
| 屬性 | 說明 | 預設 | 
|---|---|---|
| ids_only | 設為 True或False。設為True時,結果中傳回的文件只包含 ID,不包含欄位。 | False(傳回所有欄位)。 | 
| returned_fields | 指定要在結果中包含哪些文件欄位。最多可指定 100 個欄位。 | 傳回所有文件欄位 (最多 100 個欄位)。 | 
| returned_expressions | 欄位運算式,說明要將哪些經過運算的欄位新增至搜尋結果傳回的每份文件。這些欄位會新增至文件的運算式屬性。若要指定欄位值,需撰寫運算式,其中可能包含一或多個文件欄位。 | 無 | 
| snippeted_fields | 文字欄位名稱清單。會為每個欄位產生一個程式碼片段。這是經過運算的欄位,會新增至搜尋結果文件中的運算式屬性。程式碼片段欄位的名稱與其來源欄位名稱相同。 這個選項使用程式碼片段函式加上兩個引數,間接建立最多包含一個相符字串的程式碼片段,其準據是搜尋用於擷取結果的查詢字串: snippet("query-string", field-name)。您也可以新增會明確呼叫程式碼片段函式的欄位運算式,以使用 returned_expressions選項建立自訂的程式碼片段。 | 無 | 
SortOptions
SortOptions 的屬性可控制搜尋結果的排序和計分。
| 屬性 | 說明 | 預設 | 
|---|---|---|
| expressions | SortExpressions的清單,代表文件的多維排序。 | 無 | 
| match_scorer | 選用的 MatchScorer物件。此屬性存在時,將會依據搜尋字詞的頻率,對文件進行計分。分數會在列在_score欄位中。對文件計分可能所費不貲,此為計費作業且需花費執行時間,並可能拖慢您的搜尋速度。請謹慎使用計分功能。 | 無 | 
| limit | 要計分和/或排序之物件的數量上限。不可超過 10,000。 | 1,000 | 
依多個索引鍵排序
您可以依多個排序索引鍵排序搜尋結果。每個索引鍵可以是單純的欄位名稱,也可以是以多個欄位運算得出的值。請注意,談及排序選項時,「運算式」一詞具有多種意義:SortOption 本身具有「運算式屬性」。此屬性是對應排序索引鍵的 SortExpression 物件清單。最後,每個 SortExpression 物件各包含一個「運算式屬性」,用於指定計算排序索引鍵值的方式。這個運算式會根據下一節中的規則進行建構。
SortExpression 也會定義排序的方向,亦能在系統無法對某份文件計算運算式時,做為預設鍵值使用。以下列出所有的屬性:
| 屬性 | 說明 | 預設 | 
|---|---|---|
| expression | 排序每份符合文件的結果時,所要評估的運算式。 | 無 | 
| direction | 搜尋結果的排序方向,為 ASCENDING或DESCENDING。 | DESCENDING | 
| default_value | 運算式預設值,文件中若沒有出現此欄位,即無法計算。必須指定文字值才能排序文字。要排序數字則須指定數值。 | 無 | 
依多值欄位排序
依特定類型的多值欄位排序時,只會使用指派至該欄位的第一個值。舉例來說,假設 DocA 和 DocB 這兩份文件都有一個名稱為「color」的文字欄位。系統會將兩個值按照順序 (red、blue) 指派給 DocA 的「color」欄位,並將兩個值按照順序 (green、red) 指派給 DocB。當您指定依文字欄位「color」執行排序時,系統會依「red」這個值排序 DocA,並依「green」這個值排序 DocB。其他欄位值不會用於排序。
排序與否
如果您沒有指定任何排序選項,系統會自動以遞減順序排序傳回的搜尋結果。此時,傳回的文件數量沒有限制。如果您有指定任何排序選項,則系統會在選取所有符合的文件後執行排序作業。有一個明確屬性 SortOptions.limit 可控制排序的規模。需排序的文件不可超過 10,000 份,預設值是 1,000。如果符合的文件數量超過 SortOptions.limit 指定的數量,則搜尋只會擷取、排序並傳回該限制數量。搜尋會從所有符合文件的清單中選取要排序的文件 (文件按遞減排列)。查詢所選出的符合文件可能會超過您可以排序的數量。若使用排序選項,且必須擷取所有符合文件,則應該設法確保查詢所傳回的文件不會超過您可以排序的數量。
撰寫運算式
運算式用於定義欄位運算式 (在「QueryOptions」中設定) 和排序運算式 (在 SortOptions 中設定)。這些運算式的撰寫形式是字串:
"price * quantity"
"(men + women)/2"
"min(daily_use, 10) * rate"
"snippet('rose', flower, 120)"
與數字欄位相關的運算式可以使用算術運算子 (+、-、*、/),以及下方所列的內建數值函式。與地理點欄位相關的運算式可以使用地理點函式和距離函式。文字欄位和 HTML 欄位的運算式可以使用程式碼片段函式。
運算式也有可能包含下列特殊字詞:
| 詞彙 | 說明 | 
|---|---|
| _rank | 文件的排名屬性。可用於欄位運算式和排序運算式。 | 
| _score | 在 SortOptions中加入MatchScorer時,系統會為文件指派分數。此字詞只能出現在排序運算式中,不能用於欄位運算式。 | 
數值函式
用於定義 FieldExpressions 和 SortExpressions 之數值的運算式可以使用這些內建函式。引數必須是數字、欄位名稱或是使用數字和欄位名稱的運算式。
| 函式 | 說明 | 範例 | 
|---|---|---|
| max | 傳回其中最大的引數。 | max(recommended_retail_price, discount_price, wholesale_price) | 
| min | 傳回其中最小的引數。 | min(height, width, length) | 
| log | 傳回自然對數。 | log(x) | 
| abs | 傳回絕對值。 | abs(x) | 
| pow | 需要兩個數值引數。呼叫 pow(x, y) 會計算出 x 的 y 次方值。 | pow(x, 2) | 
| count | 需以一個欄位名稱做為引數。會傳回文件中使用該名稱的欄位數量。請注意,一份文件可包含同名但類型不同的多個欄位。注意: count僅限用於FieldExpressions。不能出現在SortExpressions中。 | count(user) | 
地理點函式
這些函式可用於與地理點欄位相關的運算式。
| 函式 | 說明 | 範例 | 
|---|---|---|
| geopoint | 以經緯度定義地理點。 | geopoint(-31.3, 151.4) | 
| distance | 計算兩個地理點之間的距離 (單位為公尺)。請注意,這兩個引數都可以是地理點欄位的名稱,或地理點函式的叫用名稱。不過,只能有一個引數是欄位名稱。 | distance(geopoint(23, 134), store_location) | 
文字片段
文字片段是指文字欄位的一個片段,該片段符合查詢字串且包括周圍文字。要建立文字片段,需呼叫 snippet 函式:
snippet(query, body, [max_chars])
- query
- 加引號的查詢字串,指定要在欄位中尋找的文字。
- body
- 文字、HTML 或 Atom 欄位的名稱。
- max_chars
- 文字片段中傳回的字元數上限。這是選用引數;預設為 160 個字元。
此函式會傳回 HTML 字串。此字串包含由內文欄位值組成的文字片段,與查詢相符的文字會以粗體顯示。