本文主要为您介绍排序和翻页相关接口。

索引预排序(IndexSort)

多元索引默认会按照索引中配置的IndexSort进行排序(含有NESTED类型的索引不支持IndexSort,没有预排序),默认的IndexSort为主键排序,用户可以在创建索引时自定义预排序方式。IndexSort决定了多元索引查询时默认的返回顺序,若用户未自定义IndexSort,即按照主键顺序返回。
说明 IndexSort不支持ScoreSort、GeoDistanceSort。

示例

"index_sort" => array(
    array(
        'field_sort' => array(
            'field_name' => 'keyword',
            'order' => SortOrderConst::SORT_ORDER_ASC,
            'mode' => SortModeConst::SORT_MODE_AVG,
        )
    ),
    array(
        'pk_sort' => array(
            'order' => SortOrderConst::SORT_ORDER_ASC
        )
    ),
)
			

查询时指定排序方式

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

  • ScoreSort
    按照分数进行排序,应用在全文索引等有相关性的场景下。需要注意,必须手动设置ScoreSort,才能按照相关性打分进行排序,否则会按照索引设置的IndexSort进行排序返回。sort字段设置:
    'sort' => array(
        array(
            'score_sort' => array(
                'order' => SortOrderConst::SORT_ORDER_DESC
            )
        ),
    )
  • PrimaryKeySort
    按照主键排序。sort字段设置:
    'sort' => array(
        array(
            'pk_sort' => array(
                'order' => SortOrderConst::SORT_ORDER_ASC
            )
        ),
    )
  • FieldSort
    按照某列进行排序。sort字段设置:
    'sort' => array(
        array(
            'field_sort' => array(
                'field_name' => 'keyword',
                'order' => SortOrderConst::SORT_ORDER_ASC,
                'mode' => SortModeConst::SORT_MODE_AVG,
            )
        ),
    )
  • GeoDistanceSort
    根据地理点距离进行排序。sort字段设置:
    'sort' => array(
        array(
            'geo_distance_sort' => array(
                'field_name' => 'geo',
                'order' => SortOrderConst::SORT_ORDER_ASC,
                'distance_type' => GeoDistanceTypeConst::GEO_DISTANCE_PLANE,
                'points' => array('0.6,0.6')
            )
        ),
    )
  • 多类型组合排序
    先按照某列排序,再按照另一列排序。sort字段设置:
    'sort' => array(
        array(
            'field_sort' => array(
                'field_name' => 'keyword',
                'order' => SortOrderConst::SORT_ORDER_ASC,
                'mode' => SortModeConst::SORT_MODE_AVG,
            )
        ),
        array(
            'pk_sort' => array(
                'order' => SortOrderConst::SORT_ORDER_ASC
            )
        ),
    )

翻页方式

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

  • 使用limit和offset
    当需要获取的总条数小于2000行时,可以通过limit和offset进行翻页,limit+offset <= 2000。
    $request = array(
        'table_name' => 'php_sdk_test',
        'index_name' => 'php_sdk_test_search_index',
        'search_query' => array(
            'offset' => 10,
            'limit' => 10,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'sort' => array(
                array(
                    'field_sort' => array(
                        'field_name' => 'keyword',
                        'order' => SortOrderConst::SORT_ORDER_ASC
                    )
                ),
            ),
            'token' => null,
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
            'return_names' => array('col1', 'col2')
        )
    );
    $response = $otsClient->search($request);
  • 使用token进行翻页
    服务端在一次查询之后会返回NextToken,用户可以使用NextToken继续读取后面的数据,排序方式会跟上一次请求一致(不管是系统默认采用IndexSort排序还是用户自定义排序)。使用Token后不能设置Offset,只能一次一次往后读,即无法跳页。
    $request = array(
        'table_name' => 'php_sdk_test',
        'index_name' => 'php_sdk_test_search_index',
        'search_query' => array(
            'offset' => 0,
            'limit' => 10,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::FUNCTION_SCORE_QUERY,
                'query' => array(
                    'query' => array(
                        'query_type' => QueryTypeConst::TERM_QUERY,
                        'query' => array(
                            'field_name' => 'keyword',
                            'term' => 'keyword'
                        )
                    ),
                    'field_value_factor' => array(
                        'field_name' => 'long'
                    )
                )
            ),
            'sort' => array(
                array(
                    'score_sort' => array(
                        'order' => SortOrderConst::SORT_ORDER_DESC
                    )
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
            'return_names' => array('keyword', 'long')
        )
    );
    
    $response = $otsClient->search($request);
    print "total_hits: " . $response['total_hits'] . "\n";
    print json_encode($response['rows'], JSON_PRETTY_PRINT);
    
    while($response['next_token'] != null) {
        $request['search_query']['token'] = $response['next_token'];
        $request['search_query']['sort'] = null;//有next_token时,不设置sort,token中含sort信息
        $response = $otsClient->search($request);
        print json_encode($response['rows'], JSON_PRETTY_PRINT);
    }