Todos los productos
Search
Centro de documentos

Tablestore:¿Cómo uso los campos de enrutamiento?

Última actualización: Sep 03, 2026

Al crear un índice de búsqueda, puede especificar una o más columnas de clave primaria como campos de enrutamiento. Cuando se escriben datos de índice en el índice de búsqueda, Tablestore determina la ubicación donde se distribuyen dichos datos según los valores de los campos de enrutamiento. Las filas que comparten los mismos valores en los campos de enrutamiento se indexan en la misma partición.

Procedimiento

  1. Especifique uno o más campos de enrutamiento al crear un índice de búsqueda.

    Si especifica campos de enrutamiento durante la creación del índice de búsqueda, estos se utilizan para localizar los datos de índice en las operaciones de lectura y escritura.

    Puede modificar dinámicamente el esquema de un índice de búsqueda para ajustar sus campos de enrutamiento. Por ejemplo, es posible cambiar el campo de enrutamiento predeterminado por campos personalizados, o viceversa. El campo de enrutamiento predeterminado corresponde a la clave de partición. Para obtener más información, consulte Dynamically modify search index schema.

    Importante

    Solo las columnas de clave primaria en Tablestore pueden configurarse como campos de enrutamiento. En la mayoría de los casos, basta con especificar un único campo de enrutamiento. Si define varios campos, el sistema concatena sus valores en uno solo para formar la clave de enrutamiento.

  2. Al consultar datos mediante el índice de búsqueda, proporcione los campos de enrutamiento en la solicitud de consulta.

    Tablestore escanea únicamente las particiones especificadas según los campos de enrutamiento incluidos en la solicitud de consulta. Esto reduce la latencia de consulta, ya que se limita el número de particiones que Tablestore debe examinar. Si configuró campos de enrutamiento para un índice de búsqueda, debe proporcionarlos obligatoriamente al realizar consultas con dicho índice. La presencia o ausencia de campos de enrutamiento no altera los resultados de la consulta; sin embargo, si no los especifica, Tablestore escaneará particiones irrelevantes, lo cual desperdicia recursos del sistema e incrementa la latencia.

    Importante

    Puede especificar uno o más valores para un campo de enrutamiento. No obstante, no es posible definir un rango de valores para dicho campo.

Métodos

Los campos de enrutamiento pueden configurarse desde la consola de Tablestore, o bien mediante Tablestore CLI o los SDK de Tablestore. Es posible definirlos tanto al crear un nuevo índice de búsqueda como al modificar uno existente. Esta sección presenta ejemplos sobre cómo especificar campos de enrutamiento durante la creación de un índice de búsqueda. A continuación se describen los requisitos previos necesarios antes de configurar campos de enrutamiento:

Nota

Después de crear un índice de búsqueda, puede modificar su esquema para ajustar los campos de enrutamiento. Para obtener más información, consulte Dynamically modify search index schema.

  • Se ha creado una data table que cumple simultáneamente con las siguientes condiciones:

    • El parámetro max versions de la tabla de datos está establecido en 1.

    • El tiempo de vida (TTL) de la tabla de datos está configurado en -1 o las operaciones de actualización están deshabilitadas.

  • Si planea usar los SDK de Tablestore para especificar campos de enrutamiento, debe tener un cliente inicializado. Para obtener más información, consulte Initialize a Tablestore client.

  • Si va a utilizar Tablestore CLI para definir campos de enrutamiento, asegúrese de haber instalado e iniciado dicha herramienta, además de haber configurado la información de la instancia a la que desea acceder. Para obtener más información, consulte Download the Tablestore CLI y Start the Tablestore CLI and configure access information.

Uso de la consola de Tablestore

Al crear un índice de búsqueda en la consola de Tablestore, active Advanced Settings y especifique los campos de enrutamiento. Para obtener más información, consulte Quick start.

Establezca Table Name como order y Index Name como order_index. Configure Schema Generation en Auto Generate. Los campos del índice incluyen user_id (String), product_nan (String) y order_time (Long). Defina Routing Key como user_id, Data Lifecycle como -1 y Pre-sort como Default Sort.

Uso de Tablestore CLI

Mediante Tablestore CLI, ejecute el comando create_search_index para crear un índice de búsqueda. Para obtener más información, consulte Search indexes.

  1. Especifique los campos de enrutamiento al crear un índice de búsqueda.

    El siguiente código de ejemplo muestra cómo crear un índice de búsqueda llamado mysearchindex. Este índice contiene el campo gid de tipo LONG, el campo uid de tipo LONG, el campo col2 de tipo LONG, el campo col3 de tipo TEXT, el campo col1 de tipo KEYWORD y el campo col3V de tipo LONG. El campo col3V es una columna virtual asociada a la columna col3 en la tabla de datos. En este ejemplo, el campo de enrutamiento del índice de búsqueda es uid.

    create_search_index -n mysearchindex

    Siga las instrucciones en pantalla para definir el esquema del índice de búsqueda. Antes de usar el índice para consultar datos, modifique la configuración de campos en el código de ejemplo según sus necesidades empresariales. Código de ejemplo:

    {
    
        "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. Proporcione los campos de enrutamiento al consultar datos mediante el índice de búsqueda.

    El siguiente fragmento de código ilustra cómo usar el índice de búsqueda mysearchindex para recuperar filas donde el valor de la columna col2 sea menor que 200. Al consultar datos, debe incluir los campos de enrutamiento del índice. En este caso, el campo de enrutamiento es uid.

    search -n search_index --return_all_indexed

    Siga las indicaciones en pantalla para establecer las condiciones de consulta. Modifique dichas condiciones en el código de ejemplo según sus requerimientos específicos antes de ejecutar consultas con el índice de búsqueda. Código de ejemplo:

    Nota

    En este ejemplo se emplea el método de consulta por rango. Para conocer los métodos de consulta compatibles con la función de índice de búsqueda, consulte Basic features.

    {
        "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
             }
         }
    }

Uso de los SDK de Tablestore

Puede utilizar los siguientes SDK de Tablestore para especificar campos de enrutamiento al crear un índice de búsqueda: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET y Tablestore SDK for PHP. En este ejemplo se utiliza Tablestore SDK for Java para demostrar cómo definir y emplear campos de enrutamiento.

El siguiente código de ejemplo muestra cómo crear un índice de búsqueda denominado order_index y establecer user_id como campo de enrutamiento al crear una tabla de datos llamada order, escribir datos en ella y proporcionar el campo de enrutamiento en una solicitud de consulta. En este escenario, la tabla de datos incluye la columna de clave primaria order_id de tipo STRING y la columna de clave primaria user_id también de tipo STRING. Por su parte, el índice de búsqueda contiene el campo product_name de tipo KEYWORD, el campo order_time de tipo LONG y el campo user_id de tipo 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());

  }