Todos os produtos
Search
Central de documentação

Tablestore:Como usar campos de roteamento?

Última atualização: Jul 16, 2026

Ao criar um índice de pesquisa, especifique uma ou mais colunas de chave primária como campos de roteamento. Quando os dados do índice são gravados no índice de pesquisa, o Tablestore determina a distribuição desses dados com base nos valores dos campos de roteamento. Linhas com os mesmos valores nesses campos são indexadas na mesma partição.

Procedimento

  1. Especifique um ou mais campos de roteamento ao criar um índice de pesquisa.

    Se você definir campos de roteamento durante a criação do índice de pesquisa, o sistema os utilizará para localizar os dados do índice nas operações de leitura e gravação.

    Modifique dinamicamente o esquema de um índice de pesquisa para alterar seus campos de roteamento. Por exemplo, altere o campo de roteamento padrão para campos personalizados ou reverta campos personalizados para o padrão. O campo de roteamento padrão corresponde à chave de partição. Para mais informações, consulte Modificar dinamicamente o esquema do índice de pesquisa.

    Importante

    Apenas colunas de chave primária no Tablestore podem ser definidas como campos de roteamento. Na maioria dos casos, basta especificar um único campo. Caso defina múltiplos campos de roteamento, o sistema concatenará seus valores em um único valor para formar a chave de roteamento.

  2. Forneça os campos de roteamento na solicitação ao consultar dados por meio do índice de pesquisa.

    O Tablestore verifica apenas as partições indicadas pelos campos de roteamento informados na consulta. Isso reduz a latência, pois restringe o escopo da varredura. Se o índice de pesquisa possuir campos de roteamento configurados, forneça-os obrigatoriamente durante as consultas. A ausência desses campos não altera o resultado da busca, mas faz com que o Tablestore verifique partições irrelevantes, desperdiçando recursos do sistema e aumentando a latência.

    Importante

    Defina um ou mais valores para um campo de roteamento. No entanto, não é permitido especificar um intervalo de valores para esse campo.

Métodos

Configure campos de roteamento pelo console do Tablestore, pela CLI do Tablestore ou pelos SDKs do Tablestore. Essa definição pode ocorrer tanto na criação de um novo índice de pesquisa quanto na modificação de um índice existente. Esta seção apresenta exemplos de como especificar campos de roteamento durante a criação do índice. Veja abaixo os pré-requisitos necessários para configurar esses campos:

Nota

Após criar um índice de pesquisa, ajuste o esquema do índice para modificar os campos de roteamento. Para mais detalhes, consulte Modificar dinamicamente o esquema do índice de pesquisa.

  • Uma tabela de dados criada que atenda simultaneamente às seguintes condições:

    • O parâmetro max versions da tabela de dados deve estar definido como 1.

    • O tempo de vida (TTL) da tabela de dados deve estar definido como -1 ou as operações de atualização na tabela devem estar proibidas.

  • Para usar os SDKs do Tablestore na definição de campos de roteamento, inicialize um cliente. Para mais informações, consulte Inicializar um cliente Tablestore.

  • Para usar a CLI do Tablestore, certifique-se de que ela esteja instalada e iniciada, com as informações de acesso à instância desejada já configuradas. Para mais detalhes, consulte Baixar a CLI do Tablestore e Iniciar a CLI do Tablestore e configurar informações de acesso.

Usar o console do Tablestore

Ao criar um índice de pesquisa no console do Tablestore, ative as Advanced Settings e especifique os campos de roteamento. Para mais informações, consulte Início rápido.

Defina Table Name como order e Index Name como order_index. Configure Schema Generation para Auto Generate. Os campos do índice incluem user_id (String), product_nan (String) e order_time (Long). Defina Routing Key como user_id, Data Lifecycle como -1 e Pre-sort como Default Sort.

Usar a CLI do Tablestore

Execute o comando create_search_index na CLI do Tablestore para criar um índice de pesquisa. Para mais informações, consulte Índices de pesquisa.

  1. Especifique os campos de roteamento durante a criação do índice de pesquisa.

    O código de exemplo abaixo demonstra a criação de um índice de pesquisa chamado mysearchindex. Este índice contém o campo gid do tipo LONG, o campo uid do tipo LONG, o campo col2 do tipo LONG, o campo col3 do tipo TEXT, o campo col1 do tipo KEYWORD e o campo col3V do tipo LONG. O campo col3V é uma coluna virtual correspondente à coluna col3 na tabela de dados. Neste exemplo, o campo de roteamento do índice é uid.

    create_search_index -n mysearchindex

    Siga as instruções na tela para definir o esquema do índice de pesquisa. Antes de utilizar o índice para consultas, adapte as configurações de campo do código de exemplo conforme as necessidades do seu negócio. Código de exemplo:

    {
    
        "IndexSetting": {
            "RoutingFields": ["uid"]
        },
        "FieldSchemas": [
        {
            "FieldName": "gid",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "uid",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col2",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col3",
            "FieldType": "TEXT",
            "Index": true,
            "Analyzer": "single_word",
            "AnalyzerParameter": {
            "CaseSensitive": true,
                "DelimitWord": null
            },
            "EnableSortAndAgg": false,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col1",
            "FieldType": "KEYWORD",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col3V",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": true,
            "SourceFieldNames": [
            "col3"
            ]
        }]
    }
  2. Informe os campos de roteamento ao consultar dados usando o índice de pesquisa.

    O exemplo a seguir mostra como usar o índice de pesquisa mysearchindex para buscar linhas em que o valor da coluna col2 seja menor que 200. Durante a consulta, forneça obrigatoriamente os campos de roteamento do índice. Neste caso, o campo de roteamento é uid.

    search -n search_index --return_all_indexed

    Siga as orientações na tela para estabelecer as condições de consulta. Adapte as condições do código de exemplo às necessidades do seu negócio antes de consultar dados com o índice de pesquisa. Código de exemplo:

    Nota

    Este exemplo utiliza o método de consulta por intervalo. Para conhecer os métodos de consulta suportados pelo recurso de índice de pesquisa, consulte Recursos básicos.

    {
        "Offset": -1,
        "Limit": 10,
        "Collapse": null,
        "Sort": null,
        "GetTotalCount": true,
        "Token": null,
    	  "IndexSetting": {
            "RoutingFields": ["uid"]
        },
        "Query": {
            "Name": "RangeQuery",
            "Query": {
                "FieldName": "col2",
                "From": null,
                "To": 200,
                "IncludeLower": false,
                "IncludeUpper": false
             }
         }
    }

Usar SDKs do Tablestore

Os seguintes SDKs do Tablestore permitem especificar campos de roteamento na criação de índices de pesquisa: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET e Tablestore SDK for PHP. Este exemplo utiliza o Tablestore SDK for Java para ilustrar a configuração e o uso de campos de roteamento.

O código abaixo exemplifica a criação de um índice de pesquisa chamado order_index, definindo user_id como campo de roteamento. O processo inclui a criação da tabela de dados order, a gravação de dados e o fornecimento do campo de roteamento na solicitação de consulta. Nesta demonstração, a tabela de dados possui as colunas de chave primária order_id (STRING) e user_id (STRING). Já o índice de pesquisa contém os campos product_name (KEYWORD), order_time (LONG) e user_id (KEYWORD).

private static void testRoute(SyncClient client) throws InterruptedException {
    // Create a table. 
    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);

    // Create a search index and specify routing fields. 
    CreateSearchIndexRequest searchIndexRequest = new CreateSearchIndexRequest();
    // Specify the name of the data table. 
    searchIndexRequest.setTableName("order"); 
    // Specify the name of the search index that is created for the data table. 
    searchIndexRequest.setIndexName("order_index"); 
    IndexSchema indexSchema = new IndexSchema();
    IndexSetting indexSetting = new IndexSetting();
    // Set the routing field to the user_id field. 
    indexSetting.setRoutingFields(Arrays.asList("user_id"));
    indexSchema.setIndexSetting(indexSetting);

    // Add index fields. The following index fields are added only for reference. You can add index fields based on your business requirements. 
    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);
    // Wait until the data table is loaded. 
    Thread.sleep(6*1000); 

    // Insert data for testing. 

    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);

      // Write data to attribute columns. 
      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));

    }
    // Wait until data is synchronized to the search index. 
    Thread.sleep(20*1000);

    // Provide the routing field in a query request. 
    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());

  }