开发者社区> 问答> 正文

多元索引路由字段如何使用?

多元索引路由字段如何使用?

展开
收起
保持可爱mmm 2020-03-29 15:39:56 592 0
1 条回答
写回答
取消 提交回答
  • 在创建多元索引时可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值计算索引数据的分布位置,路由字段的值相同的记录会被索引到相同的数据分区中。 使用方法

    在创建索引时,指定一个或多个路由字段。
    
    您在创建多元索引时指定了路由字段后,索引数据的读写都会使用该路由字段进行定位,不能动态改变。如果想使用系统默认路由(即主键列路由)或者重新指定其他字段为路由字段,您需要重建索引。
    说明 路由字段只能是表格存储的主键列。
    在索引查询时,在查询请求中指定路由字段值。
    
    查询时使用路由,定向搜索指定数据分区,可以减少长尾对延迟的影响。对于自定义路由的查询请求,都要求用户提供路由字段。如不指定,虽然查询结果一样,但查询时会访问无关的数据分区,浪费系统资源,增加访问延迟。
    

    示例代码

    private static void testRoute(SyncClient client) throws InterruptedException { //创建表 TableMeta meta = new TableMeta("order"); meta.addPrimaryKeyColumn("order_id",PrimaryKeyType.STRING); meta.addPrimaryKeyColumn("user_id",PrimaryKeyType.STRING); TableOptions options = new TableOptions(); options.setMaxVersions(1); options.setTimeToLive(-1); CreateTableRequest request = new CreateTableRequest(meta,options); request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0))); CreateTableResponse response = client.createTable(request);

        //创建多元索引并指定路由字段
    
        CreateSearchIndexRequest searchIndexRequest = new CreateSearchIndexRequest();
        searchIndexRequest.setTableName("order"); //订单表
        searchIndexRequest.setIndexName("order_index");  //订单表索引名
        IndexSchema indexSchema = new IndexSchema();
        IndexSetting indexSetting = new IndexSetting();
        indexSetting.setRoutingFields(Arrays.asList("user_id"));//设置商户id为路由字段
        indexSchema.setIndexSetting(indexSetting);
    
        //添加索引字段 这里只是给出示例,您可以根据业务需求添加索引字段
        indexSchema.setFieldSchemas(Arrays.asList(
                new FieldSchema("product_name",FieldType.KEYWORD).setStore(true).setIndex(true),
                new FieldSchema("order_time",FieldType.LONG).setStore(true).setEnableSortAndAgg(true).setIndex(true),
                new FieldSchema("user_id",FieldType.KEYWORD).setStore(true).setIndex(true)
        ));
    
        searchIndexRequest.setIndexSchema(indexSchema);
        client.createSearchIndex(searchIndexRequest);
    
        Thread.sleep(6*1000); // 等待数据表加载
    
        //插入一些测试数据
    
        String[] productName = new String[]{"product a", "product b", "product c"};
        String[] userId = new String[]{"00001", "00002", "00003", "00004", "00005"};
        for (int i = 0; i < 100; i++){
    
            PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            primaryKeyBuilder.addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString(i+""));
            primaryKeyBuilder.addPrimaryKeyColumn("user_id",PrimaryKeyValue.fromString(userId[i%(userId.length)]));
            PrimaryKey primaryKey = primaryKeyBuilder.build();
    
            RowPutChange rowPutChange = new RowPutChange("order",primaryKey);
    
            //写入属性列
            rowPutChange.addColumn("product_name",ColumnValue.fromString(productName[i%(productName.length)]));
            rowPutChange.addColumn("order_time",ColumnValue.fromLong(System.currentTimeMillis()));
            rowPutChange.setCondition(new Condition(RowExistenceExpectation.IGNORE));
    
            client.putRow(new PutRowRequest(rowPutChange));
    
        }
    
        Thread.sleep(20*1000);//等待数据同步到多元索引
    
        //带上路由字段的查询
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.setTableName("order");
        searchRequest.setIndexName("order_index");
        MatchQuery matchQuery = new MatchQuery();
        matchQuery.setFieldName("user_id");
        matchQuery.setText("00002");
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.setQuery(matchQuery);
        searchQuery.setGetTotalCount(true);
    
        SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        columnsToGet.setReturnAll(true);
        searchRequest.setColumnsToGet(columnsToGet);
        searchRequest.setSearchQuery(searchQuery);
    
        PrimaryKeyBuilder pkbuild = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        pkbuild.addPrimaryKeyColumn("user_id",PrimaryKeyValue.fromString("00002"));
        PrimaryKey routingValue = pkbuild.build();
        searchRequest.setRoutingValues(Arrays.asList(routingValue));
        SearchResponse searchResponse = client.search(searchRequest);
    
        System.out.println(searchResponse.isAllSuccess());
        System.out.println("totalCount:"+ searchResponse.getTotalCount());
        System.out.println("RowCount:"+searchResponse.getRows().size());
    
    }
    
    2020-03-29 15:44:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
Phoenix 全局索引原理与实践 立即下载
《开放搜索查询分析服务架构分享》 立即下载