范围查询

更新时间:
复制 MD 格式

使用 Tablestore Java SDK 的多元索引范围查询可按指定字段值的上下界筛选数据,并通过开闭区间控制是否包含边界值。

前提条件

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

功能说明

范围查询用于匹配字段值处于指定区间内的数据。可以只设置下界或上界,也可以同时设置两个边界;至少需要设置一个边界。对于 Text 类型字段,只要分词后的任一词条处于指定区间内,该行数据即满足查询条件。

使用 greaterThangreaterThanOrEquallessThanlessThanOrEqual 方法可分别设置大于、大于等于、小于和小于等于条件。调用 search 方法时,将查询类型设置为 RangeQuery

SearchResponse search(SearchRequest request)

以下示例查询 Long 类型的 price 字段值处于左闭右开区间 [100, 500) 内的数据,返回最多 10 行数据及匹配总行数。

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

RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("price");
rangeQuery.greaterThanOrEqual(ColumnValue.fromLong(100L));
rangeQuery.lessThan(ColumnValue.fromLong(500L));

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(rangeQuery);
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);
System.out.println(response.getTotalCount());
System.out.println(response.getRows());

参数说明

查询请求

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

名称

类型

说明

tableName(必选)

String

数据表名称。

indexName(必选)

String

多元索引名称。

searchQuery(必选)

SearchQuery

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

columnsToGet(可选)

SearchRequest.ColumnsToGet

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

timeoutInMillisecond(可选)

int

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

routingValues(可选)

List<PrimaryKey>

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

查询配置

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

名称

类型

说明

query(必选)

Query

查询条件。范围查询设置为 RangeQuery

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

名称

类型

说明

fieldName(必选)

String

要查询的索引字段名称。范围查询支持 LongDoubleBooleanKeywordTextDateIP 类型字段,以及 JSON Object 的子字段。对于 Text 字段,任一分词词条处于指定区间内即匹配。

from(可选)

ColumnValue

查询区间的下界,fromto 必须至少设置一个。调用 greaterThangreaterThanOrEqual 可同时设置下界和是否包含下界。

to(可选)

ColumnValue

查询区间的上界,fromto 必须至少设置一个。调用 lessThanlessThanOrEqual 可同时设置上界和是否包含上界。

includeLower(可选)

boolean

是否包含 from。默认值为 falsegreaterThan 将其设置为 falsegreaterThanOrEqual 将其设置为 true

includeUpper(可选)

boolean

是否包含 to。默认值为 falselessThan 将其设置为 falselessThanOrEqual 将其设置为 true

返回列

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() 获取。配置 highlight 后,从该字段读取行数据和摘要与高亮结果。

nextToken

byte[]

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

isAllSuccess

boolean

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

场景示例

查询自定义格式的日期

如果数据表中的 date_string 字段为 String 类型,并在多元索引中映射为使用 yyyy-MM-dd HH:mm:ss 格式的 Date 类型,可使用相同格式的字符串设置查询边界。以下示例查询 [2021-01-01 00:00:00, 2023-01-01 00:00:00) 内的数据。

RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("date_string");
rangeQuery.greaterThanOrEqual(ColumnValue.fromString("2021-01-01 00:00:00"));
rangeQuery.lessThan(ColumnValue.fromString("2023-01-01 00:00:00"));

查询秒级时间戳

如果数据表中的 date_epoch 字段为 Integer 类型,并在多元索引中映射为使用 epoch_second 格式的 Date 类型,可使用秒级 Unix 时间戳设置查询边界。以下示例查询值大于 1609459200 的数据。

RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("date_epoch");
rangeQuery.greaterThan(ColumnValue.fromLong(1609459200L));