本文主要为您介绍多元索引的排序方式以及翻页方式。

索引预排序(IndexSort)

多元索引默认会按照索引中配置的IndexSort进行排序(含有NESTED类型的索引不支持IndexSort,没有预排序),默认的IndexSort为主键排序,用户可以在创建索引时自定义预排序方式。

IndexSort决定了多元索引查询时默认的返回顺序,若用户未自定义IndexSort,即按照主键顺序返回。

查询时指定排序方式

在每次查询时,用户也可以指定排序方式,多元索引支持以下四种排序方式(Sorter)。用户也可以使用多个Sorter,实现先按照某种方式排序,再按照某种方式排序的需求。

ScoreSort

按照分数进行排序,应用在全文索引等有相关性的场景下。需要注意的时,必须手动设置ScoreSort,才能按照相关性打分进行排序,否则会按照索引设置的IndexSort进行排序返回。

sort字段设置:

score_sort = ScoreSort(sort_order=SortOrder.DESC)
PrimaryKeySort

按照主键排序。

sort字段设置:

primary_key_sort = PrimaryKeySort(sort_order=SortOrder.DESC)
FieldSort

按照某列进行排序。

sort字段设置:

field_sort = FieldSort('l', SortOrder.ASC)

nested_field_sort = FieldSort(
    'n.nl', 
    sort_order=SortOrder.ASC, 
    nested_filter=NestedFilter('n', RangeQuery('n.nl', range_from=150, range_to=200))
)

先按照某列排序,再按照另一列排序。

sort字段设置:
sort = Sort(
    sorters=[
        FieldSort('a', SortOrder.ASC),
        FieldSort('b', SortOrder.ASC)
    ]
)
GeoDistanceSort

根据地理点距离进行排序。

sort字段设置:
geo_distance_sort = GeoDistanceSort('g', ['32.5,116.5', '32.0,116.0'], sort_order=SortOrder.DESC, sort_mode=SortMode.MAX) 

				

翻页方式

只有enable_sort_and_agg设置为true的字段才能进行排序,排序方式支持多条件设置。

使用limit和offset

当需要获取的总条数小于2000行时,可以通过limit和offset进行翻页,limit+offset <= 2000.

query = RangeQuery('k', 'key100', 'key500', include_lower=False, include_upper=False)
rows, next_token, total_count, is_all_succeed = client.search(
    table_name, index_name, 
    SearchQuery(query, offset=100, limit=100, get_total_count=True), 
    ColumnsToGet(return_type=ColumnReturnType.ALL)
)
			
使用token进行翻页

服务端在一次查询之后会返回next_token,用户可以使用next_token继续读取后面的数据,排序方式会跟上一次请求一致(不管是系统默认采用IndexSort排序还是用户自定义排序)。使用Token后不能设置Offset,只能一次一次往后读,即无法跳页。

query = MatchAllQuery()
all_rows = []
next_token = None

while not all_rows or next_token:
    rows, next_token, total_count, is_all_succeed = client.search(table_name, index_name,
        SearchQuery(query, next_token=next_token, limit=100, get_total_count=True),
        columns_to_get=ColumnsToGet(['k', 't', 'g', 'ka', 'la'], ColumnReturnType.SPECIFIED))
    all_rows.extend(rows)

for row in all_rows:
    print row

print 'Total rows:', len(all_rows)