使用 Tablestore Go SDK 按欄位值、相關性評分、主鍵或地理距離排序查詢結果,並通過 Token 連續翻頁。
前提條件
安裝Tablestore Go SDK並初始化用戶端。
功能說明
查詢時可以設定一個或多個排序器,系統按排序器列表的先後順序比較結果。未設定排序時使用建立多元索引時配置的 IndexSort;未配置 IndexSort 時預設按主鍵排序。IndexSort 僅支援 PrimaryKeySort 和 FieldSort。建立索引後,可通過動態修改 Schema修改 IndexSort。ScoreSort 按 BM25 演算法計算的相關性評分排序,必須顯式設定才會生效。
查詢時指定非主鍵排序器後,服務端預設追加主鍵排序器,使排序值相同的行保持確定的返回順序。DisableDefaultPkSorter 的預設值為 false。使用 Token 翻頁時不要禁用該行為;如果排序值重複且禁用主鍵排序,可能漏讀資料。
包含 Nested 欄位的多元索引不支援 IndexSort。如果查詢此類索引時需要翻頁,必須在查詢請求中顯式設定排序,否則資料未讀取完時服務端不會返回 NextToken。
使用 ScoreSort 時,FuzzyKeyword 欄位不參與排序,且 Weight 對 FuzzyKeyword 欄位無效。
searchQuery := search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(10).
SetSort(&search.Sort{Sorters: []search.Sorter{
&search.FieldSort{
FieldName: "price",
Order: search.SortOrder_DESC.Enum(),
},
}})
for {
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
for _, row := range response.Rows {
fmt.Println(row)
}
if len(response.NextToken) == 0 {
break
}
searchQuery.SetToken(response.NextToken)
}
參數說明
排序配置
|
名稱 |
類型 |
說明 |
|
Sorters(必選) |
[]search.Sorter |
排序器列表,支援 FieldSort、ScoreSort、PrimaryKeySort 和 GeoDistanceSort。排序器按列表順序依次生效。DocSort 僅支援在 NestedQuery.InnerHits 中顯式設定,不能作為頂層 Search 的排序器。 |
|
DisableDefaultPkSorter(可選) |
*bool |
是否禁用服務端自動追加的主鍵排序器,預設值為 false。Go SDK 1.7.16 及以上版本支援該參數。 |
欄位值排序
|
名稱 |
類型 |
說明 |
|
FieldName(必選) |
string |
用於排序的欄位名稱。該欄位必須啟用排序與統計彙總。 |
|
Order(可選) |
*search.SortOrder |
排序方向,支援 search.SortOrder_ASC 和 search.SortOrder_DESC,預設升序。 |
|
Mode(可選) |
*search.SortMode |
多重值欄位參與排序的取值方式,支援 search.SortMode_Min、search.SortMode_Max 和 search.SortMode_Avg。 |
|
NestedFilter(可選) |
*search.NestedFilter |
Nested 子欄位排序配置。僅對 Nested 子欄位排序時設定。 |
|
MissingValue(可選) |
interface{} |
FieldName 和 MissingFields 指定的欄位均缺失時的排序值。設定為 search.FirstWhenMissing 時,無論升序或降序,缺失值均排在最前;設定為 search.LastWhenMissing 或 nil 時均排在最後。也可以設定與欄位類型一致的自訂值參與排序。 |
|
MissingField(可選) |
*string |
備用排序欄位。該參數已廢棄,請使用 MissingFields。 |
|
MissingFields(可選) |
[]string |
備用排序欄位列表。FieldName 指定的欄位缺失時,按列表順序使用首個存在的欄位值參與排序。最多設定 3 個,且欄位類型必須與 FieldName 指定的欄位相同,所有欄位都必須啟用排序與統計彙總。Go SDK 1.9.0 及以上版本支援該參數。 |
Nested 過濾
|
名稱 |
類型 |
說明 |
|
Path(必選) |
string |
Nested 欄位路徑。 |
|
Filter(必選) |
search.Query |
篩選參與排序的 Nested 子行的查詢條件。設定為 MatchAllQuery 時使用全部子行。 |
相關性評分、主鍵和文檔順序排序
|
名稱 |
類型 |
說明 |
|
ScoreSort.Order(可選) |
*search.SortOrder |
BM25 相關性評分的排序方向。search.NewScoreSort() 預設按評分降序排列。 |
|
PrimaryKeySort.Order(可選) |
*search.SortOrder |
主鍵排序方向。search.NewPrimaryKeySort() 預設按主鍵升序排列。 |
|
DocSort.SortOrder(可選) |
*search.SortOrder |
NestedQuery.InnerHits 內部文檔的排序方向,預設升序。Go SDK 1.7.12 及以上版本支援 DocSort。 |
地理距離排序
|
名稱 |
類型 |
說明 |
|
FieldName(必選) |
string |
Geo-point 欄位名稱。 |
|
Points(必選) |
[]string |
用於計算距離的目標點列表。座標使用 |
|
Order(可選) |
*search.SortOrder |
距離排序方向。search.SortOrder_ASC 表示由近到遠,search.SortOrder_DESC 表示由遠到近。 |
|
Mode(可選) |
*search.SortMode |
存在多個距離時參與排序的取值方式,支援 search.SortMode_Min、search.SortMode_Max 和 search.SortMode_Avg。 |
|
GeoDistanceType(可選) |
*search.GeoDistanceType |
距離計算方式。search.GeoDistanceType_ARC 按球面計算,精度較高;search.GeoDistanceType_PLANE 按平面計算,計算量較小。預設值為 ARC。 |
|
NestedFilter(可選) |
*search.NestedFilter |
Nested 子欄位排序時的路徑和過濾條件。 |
翻頁配置
|
名稱 |
類型 |
說明 |
|
Limit(可選) |
int32 |
每頁返回的最大行數,預設值為 10。通常最大值為 100;如果返回列均儲存在多元索引中,最大值可提高到 1000,具體請參見如何將多元索引 Search 介面查詢資料的 limit 提高到 1000。使用 Offset 翻頁時,Offset + Limit 不能超過 100000。 |
|
Offset(可選) |
int32 |
起始位置,預設值為 0,適合不超過 100000 行的淺翻頁。 |
|
Token(可選) |
[]byte |
上一頁響應中的 NextToken,適合連續深度翻頁。調用 SetToken 會清除 Sort,因為 Token 已包含上一頁的排序條件;使用 Token 翻頁時不能設定 Offset。如需將二進位 Token 持久化或通過文本協議、跨進程傳輸,使用 Base 64 編碼。 |
Token 預設只能向後翻頁。如需返回上一頁,可以緩衝之前響應的 Token 並重新使用。Token 翻頁深度不受 100000 行限制。
傳回值
|
名稱 |
類型 |
說明 |
|
Rows |
[]*tablestore.Row |
本次查詢返回的行,數量不超過 Limit。 |
|
SearchHits |
[]*tablestore.SearchHit |
查詢命中結果。使用相關性評分、摘要與高亮或 Nested InnerHits 時從該欄位讀取。 |
|
TotalCount |
int64 |
匹配總行數。傳回值取決於 SetGetTotalCount 配置,不是本頁返回行數。 |
|
NextToken |
[]byte |
下一頁憑證。值為空白表示沒有更多資料,或當前查詢沒有確定的排序方式。 |
|
IsAllSuccess |
bool |
是否已成功查詢全部索引分割區。值為 false 時返回的是部分結果。 |