固定评分查询

更新时间:
复制 MD 格式

使用 Tablestore Java SDK 的固定评分查询可将子查询作为过滤条件,并为所有命中数据返回固定的相关性得分 1.0。

前提条件

安装Tablestore Java SDK并初始化客户端。

功能说明

固定评分查询将一个子查询作为过滤条件,只判断数据是否满足子查询,不根据 BM25 等算法计算子查询的相关性得分。所有命中数据的相关性得分均为 1.0。

将查询类型设置为 ConstScoreQuery,并通过 filter 设置要包装的子查询。filter 支持任意 Query 类型。

以下示例使用固定评分查询包装匹配查询,查询 description 字段中包含 tablestore 的数据,并按相关性得分排序。

String tableName = "example_table";
String indexName = "example_index";

MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore");

ConstScoreQuery constScoreQuery = new ConstScoreQuery();
constScoreQuery.setFilter(matchQuery);

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(constScoreQuery);
searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);

SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);

SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
    System.out.println(hit.getRow());
    System.out.println(hit.getScore());
}

参数说明

查询请求

request 的类型为 SearchRequest,包含以下参数。

名称

类型

说明

tableName(必选)

String

数据表名称。

indexName(必选)

String

多元索引名称。

searchQuery(必选)

SearchQuery

查询条件和通用查询配置。

columnsToGet(可选)

SearchRequest.ColumnsToGet

返回列配置。未设置时只返回主键列。

timeoutInMillisecond(可选)

int

请求级查询超时时间,单位为毫秒。默认值为 -1,表示不单独设置查询超时时间。

routingValues(可选)

List<PrimaryKey>

自定义路由字段对应的主键值列表。未配置自定义路由时无需设置。

查询配置

request.searchQuery 的类型为 SearchQuery,包含以下参数。

名称

类型

说明

query(必选)

Query

查询条件。固定评分查询设置为 ConstScoreQuery

offset(可选)

Integer

本次查询的起始位置。

limit(可选)

Integer

本次查询返回的最大行数。设置为 0 时不返回具体行。

highlight(可选)

Highlight

子查询匹配 Text 字段时的摘要与高亮配置。有关配置方法,请参见摘要与高亮

collapse(可选)

Collapse

结果折叠配置,用于按指定列对返回结果去重。有关配置方法,请参见折叠(去重)

sort(可选)

Sort

返回结果的排序方式。有关配置方法,请参见排序和翻页

trackTotalCount(可选)

int

期望统计的最大匹配行数。默认值为 TRACK_TOTAL_COUNT_DISABLED,表示不统计;设置为 TRACK_TOTAL_COUNT 时统计全部匹配行。值越小,查询性能越高。

filter(可选)

SearchFilter

query 的查询结果进行过滤。

aggregationList(可选)

List<Aggregation>

统计聚合配置。有关配置方法,请参见统计聚合

groupByList(可选)

List<GroupBy>

分组配置。有关配置方法,请参见统计聚合

token(可选)

byte[]

翻页凭证。将上一次响应的 nextToken 设置为该参数可继续读取后续数据。设置 token 时,SDK 会清除 sort,因为翻页凭证中已包含排序条件。

固定评分查询条件

request.searchQuery.query 的类型为 ConstScoreQuery,包含以下参数。

名称

类型

说明

filter(必选)

Query

要包装的子查询。支持任意 Query 类型。仅判断数据是否满足该子查询,所有命中数据的相关性得分均为 1.0。

返回列

request.columnsToGet 的类型为 SearchRequest.ColumnsToGet,包含以下参数。

名称

类型

说明

columns(可选)

List<String>

要返回的属性列名称。仅 returnAllreturnAllFromIndex 均为 false 时需要设置;未设置时只返回主键列。

returnAll(可选)

boolean

是否返回数据表中的全部属性列。默认值为 false

returnAllFromIndex(可选)

boolean

是否返回已建立索引的全部属性列。默认值为 false。不能与 returnAll 同时设置为 true

返回值

查询响应

search 方法返回 SearchResponse。核心字段如下。

名称

类型

说明

totalCount

long

匹配行数,通过 getTotalCount() 获取。返回值取决于 trackTotalCount 配置。

rows

List<Row>

本次查询返回的行数据,通过 getRows() 获取。返回数量不超过 limit

searchHits

List<SearchHit>

查询命中结果,通过 getSearchHits() 获取。可从该字段读取相关性得分和摘要与高亮结果。

nextToken

byte[]

下一页凭证,通过 getNextToken() 获取。值不为 null 时,将其设置到下一次请求的 token 中继续读取。

isAllSuccess

boolean

是否已成功查询全部索引分区,通过 isAllSuccess() 获取。值为 false 时,返回的是部分结果,totalCount 可能小于实际匹配行数。

查询命中

response.searchHits[] 的类型为 SearchHit,包含以下核心字段。

名称

类型

说明

row

Row

命中的行数据,通过 getRow() 获取。

score

Double

相关性得分,通过 getScore() 获取。使用 ScoreSort 按相关性得分排序且固定评分查询为顶层查询条件时,命中项的值为 1.0;作为其他查询的子查询时,最终得分还包括其他参与算分的子查询得分。

highlightResultItem

HighlightResultItem

摘要与高亮结果,通过 getHighlightResultItem() 获取。

场景示例

与多条件组合查询组合

将固定评分查询添加到 BoolQuery.mustQueries 中,可让该子查询为每条命中数据贡献固定的相关性得分 1.0,其他子查询仍按各自的规则计算相关性得分。最终得分为各子查询得分之和。

以下示例查询 category 字段值为 bookdescription 字段中包含 tablestore 的数据。

TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));

ConstScoreQuery constScoreQuery = new ConstScoreQuery();
constScoreQuery.setFilter(categoryQuery);

MatchQuery descriptionQuery = new MatchQuery();
descriptionQuery.setFieldName("description");
descriptionQuery.setText("tablestore");

BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(Arrays.asList(constScoreQuery, descriptionQuery));

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));

SearchRequest request = new SearchRequest(
        "example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
System.out.println(response.getRows());

有关多条件组合查询的更多信息,请参见多条件组合查询

用于并发扫描

并发扫描不需要按相关性得分排序时,可将查询条件包装为固定评分查询,使查询只判断数据是否命中,不按 BM25 等算法计算子查询的相关性得分。

以下示例使用固定评分查询筛选 description 字段中包含 tablestore 的数据,并读取所有并发任务的查询结果。

String tableName = "example_table";
String indexName = "example_index";

MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore");

ConstScoreQuery constScoreQuery = new ConstScoreQuery();
constScoreQuery.setFilter(matchQuery);

ComputeSplitsRequest splitsRequest = new ComputeSplitsRequest();
splitsRequest.setTableName(tableName);
splitsRequest.setSplitsOptions(new SearchIndexSplitsOptions(indexName));
ComputeSplitsResponse splitsResponse = client.computeSplits(splitsRequest);

for (int parallelId = 0;
        parallelId < splitsResponse.getSplitsSize();
        parallelId++) {
    ScanQuery scanQuery = new ScanQuery();
    scanQuery.setQuery(constScoreQuery);
    scanQuery.setLimit(2000);
    scanQuery.setMaxParallel(splitsResponse.getSplitsSize());
    scanQuery.setCurrentParallelId(parallelId);

    ParallelScanRequest request = new ParallelScanRequest();
    request.setTableName(tableName);
    request.setIndexName(indexName);
    request.setScanQuery(scanQuery);
    request.setSessionId(splitsResponse.getSessionId());

    RowIterator iterator = client.createParallelScanIterator(request);
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}

有关并发扫描的更多信息,请参见并发导出数据