匹配查询

更新时间:
复制 MD 格式

使用 Tablestore Java SDK 的匹配查询可检索 Text 或 Keyword 类型字段,并返回满足匹配条件的数据及相关性得分。

前提条件

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

功能说明

匹配查询用于检索 TextKeyword 类型字段(字段说明请参见字符串类型),两种字段的匹配方式不同:

  • Text:使用创建多元索引时配置的分词器对字段值和查询文本分词,然后根据词条匹配。未配置分词器时,默认使用单字分词。默认使用 OR 逻辑,字段值包含任意查询词条即可命中;也可改为 AND 逻辑,或指定最少需要匹配的词条数。

  • Keyword:字段值和查询文本均不分词,字段完整值与查询文本相同时命中。

匹配查询只判断词条是否匹配,不要求词条按查询文本中的顺序相邻出现。如需按词条顺序匹配,请使用短语匹配查询。如果 Text 字段使用模糊分词器且需要执行高性能模糊查询,也建议使用短语匹配查询。

以下示例查询 description 字段中包含 tablestoredurable 词条的数据,返回最多 10 行数据、匹配总行数和相关性得分。

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

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

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);
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

查询条件。匹配查询设置为 MatchQuery

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 的类型为 MatchQuery,包含以下参数。

名称

类型

说明

fieldName(必选)

String

要查询的 TextKeyword 类型索引字段名称。

text(必选)

String

查询文本。查询 Text 字段时,使用字段的分词器对查询文本分词;查询 Keyword 字段时,不对查询文本分词。

operator(可选)

QueryOperator

查询词条的组合方式。OR(默认)表示匹配任意词条即可命中;AND 表示必须匹配所有词条。

minShouldMatch(可选)

String 或 int

operatorOR 时,至少需要匹配的查询词条数。可设置整数,例如 2,也可设置百分比字符串,例如 "75%"

weight(可选)

float

查询权重。默认值为 1.0,必须为正浮点数。值越大,该查询对相关性得分的贡献越大,不改变匹配范围。

重要

setMinimumShouldMatch(Integer) 已弃用。请使用 setMinShouldMatch(int)setMinShouldMatch(String)

返回列

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 按相关性得分排序时返回实际得分。匹配词条和 weight 会影响该值。

highlightResultItem

HighlightResultItem

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

场景示例

匹配全部查询词条

operator 设置为 AND,只有字段值包含全部查询词条时才命中。

MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore durable");
matchQuery.setOperator(QueryOperator.AND);

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);

设置最小匹配词条数

使用 OR 逻辑时,可通过 minShouldMatch 指定至少需要匹配的查询词条数。以下示例要求至少匹配两个词条。

MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore durable cloud");
matchQuery.setOperator(QueryOperator.OR);
matchQuery.setMinShouldMatch(2);

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);