使用 Tablestore Go SDK 的固定评分查询为所有匹配数据设置相同的相关性评分。
前提条件
安装Tablestore Go SDK并初始化客户端。
功能说明
固定评分查询将 Filter 指定的子查询作为过滤条件,只判断数据是否满足子查询,不计算该子查询的 BM25 等相关性评分。固定评分查询作为顶层查询条件时,所有命中数据的相关性评分均为 1.0;作为其他查询的子查询时,该分值会与其他参与算分的子查询评分合并。
func (client *tablestore.TableStoreClient) Search(request *tablestore.SearchRequest) (*tablestore.SearchResponse, error)
以下示例使用固定评分查询包装匹配查询,查询 title 字段中包含 go 的数据,并按相关性评分排序。固定评分查询是顶层查询条件,因此从 SearchHits[].Score 读取到的命中评分均为 1.0。
tableName := "example_table"
indexName := "example_index"
query := &search.ConstScoreQuery{
Filter: &search.MatchQuery{
FieldName: "title",
Text: "go",
},
}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10).
SetGetTotalCount(true).
SetSort(&search.Sort{Sorters: []search.Sorter{search.NewScoreSort()}})
response, err := client.Search(&tablestore.SearchRequest{
TableName: tableName,
IndexName: indexName,
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.TotalCount)
for _, hit := range response.SearchHits {
fmt.Println(hit.Row, *hit.Score)
}
参数说明
查询请求
request 的类型为 tablestore.SearchRequest,包含以下参数。
|
名称 |
类型 |
说明 |
|
TableName(必选) |
string |
数据表名称。 |
|
IndexName(必选) |
string |
多元索引名称。 |
|
SearchQuery(必选) |
search.SearchQuery |
查询条件和通用查询配置。 |
|
ColumnsToGet(可选) |
*tablestore.ColumnsToGet |
返回列配置。未设置时只返回主键列。 |
|
RoutingValues(可选) |
[]*tablestore.PrimaryKey |
自定义路由字段对应的主键值列表。未配置自定义路由时无需设置。 |
|
TimeoutMs(可选) |
*int32 |
请求级超时时间,单位为毫秒。 |
查询配置
通过 search.NewSearchQuery() 创建查询配置,并使用以下方法设置参数。
|
名称 |
类型 |
说明 |
|
SetQuery(必选) |
search.Query |
设置查询条件。 |
|
SetOffset(可选) |
int32 |
设置本次查询的起始位置,默认值为 0。使用 Offset 翻页时,Offset + Limit 不能超过 100000。 |
|
SetLimit(可选) |
int32 |
设置本次查询返回的最大行数,默认值为 10,最大值为 100。设置为 0 时不返回具体行。 |
|
SetHighlight(可选) |
*search.Highlight |
设置 Text 字段的摘要与高亮。配置方法请参见摘要与高亮。 |
|
SetCollapse(可选) |
*search.Collapse |
设置结果折叠。配置方法请参见折叠(去重)。 |
|
SetSort(可选) |
*search.Sort |
设置返回结果的排序方式。配置方法请参见排序和翻页。 |
|
SetGetTotalCount(可选) |
bool |
是否统计匹配总行数,默认值为 false。 |
|
SetToken(可选) |
[]byte |
设置上一次响应返回的 NextToken,以继续读取后续数据。调用该方法会清除 Sort,因为 Token 已包含上一页的排序条件。使用 Token 翻页时不能设置 Offset。 |
|
SetSearchFilter(可选) |
*search.SearchFilter |
对查询结果执行后过滤。配置方法请参见查询后过滤。 |
|
Aggregation(可选) |
...search.Aggregation |
设置统计聚合。配置方法请参见统计聚合。 |
|
GroupBy(可选) |
...search.GroupBy |
设置分组。配置方法请参见统计聚合。 |
查询条件
查询类型为 search.ConstScoreQuery,包含以下参数。
|
名称 |
类型 |
说明 |
|
Filter(必选) |
search.Query |
用于筛选数据的子查询。 |
返回列
request.ColumnsToGet 的类型为 tablestore.ColumnsToGet,包含以下参数。
|
名称 |
类型 |
说明 |
|
Columns(可选) |
[]string |
要返回的属性列名称。仅 ReturnAll 和 ReturnAllFromIndex 均为 false 时生效。 |
|
ReturnAll(可选) |
bool |
是否返回数据表中的全部属性列,默认值为 false。 |
|
ReturnAllFromIndex(可选) |
bool |
是否返回已建立索引的全部属性列,默认值为 false。不能与 ReturnAll 同时设置为 true。 |
返回值
Search 方法返回 tablestore.SearchResponse。核心业务字段如下。
|
名称 |
类型 |
说明 |
|
TotalCount |
int64 |
匹配总行数。返回值取决于 SetGetTotalCount 配置。 |
|
Rows |
[]*tablestore.Row |
本次查询返回的行数据,数量不超过 SetLimit 指定的值。 |
|
SearchHits |
[]*tablestore.SearchHit |
查询命中结果。配置摘要与高亮、嵌套 InnerHits 或需要相关性评分时,从该字段读取结果。 |
|
SearchHits[].Score |
*float64 |
相关性评分。使用 ScoreSort 按相关性评分排序且固定评分查询为顶层查询条件时,值为 1.0;固定评分查询作为其他查询的子查询时,最终评分还包括其他参与算分的子查询评分。 |
|
NextToken |
[]byte |
下一页凭证。值非空时,将其传入下一次查询继续读取。 |
|
IsAllSuccess |
bool |
是否已成功查询全部索引分区。值为 false 时返回的是部分结果,TotalCount 可能小于实际匹配行数。 |
|
AggregationResults |
search.AggregationResults |
统计聚合结果。 |
|
GroupByResults |
search.GroupByResults |
分组结果。 |
场景示例
与多条件组合查询配合使用
将固定评分查询添加到 BoolQuery.MustQueries 中,该子查询为每条命中数据贡献固定的相关性评分 1.0,其他子查询仍按各自规则计算相关性评分。最终评分为各子查询评分之和。
query := &search.BoolQuery{
MustQueries: []search.Query{
&search.ConstScoreQuery{
Filter: &search.MatchQuery{
FieldName: "title",
Text: "go",
},
},
&search.MatchQuery{
FieldName: "title",
Text: "guide",
},
},
}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10).
SetSort(&search.Sort{Sorters: []search.Sorter{search.NewScoreSort()}})
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
})
if err != nil {
log.Fatal(err)
}
for _, hit := range response.SearchHits {
fmt.Println(hit.Row, *hit.Score)
}
与并发导出数据配合使用
并发扫描不需要按相关性评分排序时,可以使用固定评分查询包装筛选条件,使扫描只判断数据是否命中,不计算子查询的 BM25 等相关性评分。以下示例展示如何在一个并发任务中将固定评分查询设置为 ScanQuery 的查询条件。完整的并发任务和分页读取流程请参见并发导出数据。
query := &search.ConstScoreQuery{
Filter: &search.MatchQuery{
FieldName: "title",
Text: "go",
},
}
splits, err := client.ComputeSplits(
(&tablestore.ComputeSplitsRequest{}).
SetTableName("example_table").
SetSearchIndexSplitsOptions(tablestore.SearchIndexSplitsOptions{
IndexName: "example_index",
}),
)
if err != nil {
log.Fatal(err)
}
scanQuery := search.NewScanQuery().
SetQuery(query).
SetLimit(1000).
SetMaxParallel(splits.SplitsSize).
SetCurrentParallelID(0)
request := (&tablestore.ParallelScanRequest{}).
SetTableName("example_table").
SetIndexName("example_index").
SetScanQuery(scanQuery).
SetSessionId(splits.SessionId).
SetColumnsToGet(&tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
})
response, err := client.ParallelScan(request)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Rows)