匹配查询

更新时间:
复制 MD 格式

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

前提条件

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

功能说明

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

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

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

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

以下示例查询 description 字段中包含 tablestore 或 durable 词条的数据,返回最多 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

要查询的 Text 或 Keyword 类型索引字段名称。

text(必选)

String

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

operator(可选)

QueryOperator

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

minShouldMatch(可选)

String 或 int

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

weight(可选)

float

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

重要

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

返回列

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

名称

类型

说明

columns(可选)

List<String>

要返回的属性列名称。仅 returnAll 和 returnAllFromIndex 均为 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);