Los índices de búsqueda admiten los tipos de datos Array y Nested, además de tipos primitivos como Long, Double, Boolean, Keyword, Text, Date, GeoPoint, Vector, IP y JSON. Utilice el tipo Array para almacenar varios valores del mismo tipo y el tipo Nested para guardar datos jerárquicos similares a JSON.
Tipo de dato Array
El tipo de dato Array se aplica únicamente a los índices de búsqueda. Las tablas de datos no son compatibles con este tipo.
Consulte un campo Array de la misma manera que un campo no Array. Se devuelve una fila si como mínimo un valor del array cumple con la condición de consulta.
El tipo de dato Vector no admite arrays.
El tipo Array es un modificador que se combina con tipos primitivos como Long, Double, Boolean, Keyword, Text, Date, IP y GeoPoint. Por ejemplo, al combinar el tipo Array con el tipo Long se crea un array de enteros largos que almacena múltiples valores de este tipo.
Formatos de Array
A continuación se describen los formatos de array para los tipos de datos primitivos en los índices de búsqueda.
|
Tipo de Array |
Descripción |
|
Long Array |
Un array de enteros largos. Ejemplo: |
|
Double Array |
Un array de números de punto flotante. Ejemplo: |
|
Boolean Array |
Un array de valores booleanos. Ejemplo: |
|
Keyword Array |
Un array de cadenas en formato JSON. Ejemplo: |
|
Text Array |
Un array de texto en formato JSON. Ejemplo: Los arrays de texto se utilizan rara vez. |
|
Date Array |
Un array de fechas. Si el tipo de fecha es un entero, el formato es |
|
IP Array |
Un array de direcciones IP en formato JSON. Ejemplo: |
|
Geopoint Array |
Un array de puntos geográficos. Ejemplo: |
Notas de uso
Para los campos de tipo Array en un índice de búsqueda, el campo correspondiente en la tabla de datos debe ser de tipo String, mientras que el campo en el índice de búsqueda debe ser del tipo primitivo correspondiente, como Long o Double.
Por ejemplo, si el campo price es de tipo Double Array, el campo price en la tabla de datos debe ser de tipo String. En el índice de búsqueda, establezca el tipo de campo como Double y agregue la propiedad isArray=true.
Ejemplos
Suponga que una tabla de datos llamada array_search_table contiene los siguientes datos de muestra.
La tabla de datos incluye la columna de clave principalpk(tipo String) y dos columnas de atributos:col_keyword_array(tipo String) ycol_long_array(tipo String).
|
pk |
col_keyword_array |
col_long_array |
|
03#server#07 |
["Development environment", "Test environment", "Physical server", "Linux" ] |
[2020, 2023] |
|
4c#server#ae |
["Production environment", "Cloud server", "Linux" ] |
[2021, 2024] |
-
Cree un índice de búsqueda.
Cree un índice de búsqueda denominado
array_query_table_index. El índice incluye dos columnas:col_keyword_array(tipo String Array) ycol_long_array(tipo Long Array).En Schema Generation Method, seleccione Auto-generate. Luego, en la tabla de configuración de campos, compruebe que el interruptor Array esté habilitado para los campos correspondientes.
-
Consulte datos de tipo Array mediante el índice de búsqueda.
El siguiente código Java consulta datos de array donde la columna
col_keyword_arraycontiene un elemento que coincide exactamente con "Cloud server" y la columnacol_long_arraycontiene un elemento igual a 2024.NotaPara consultar datos de tipo Array en un índice de búsqueda mediante sentencias SQL, consulte Execute SQL statements to query data using the search index.
private static void query(SyncClient client) { // Condition 1: The col_keyword_array field contains an element that is an exact match for "ECS". TermQuery keywordTermQuery = new TermQuery(); keywordTermQuery.setFieldName("col_keyword_array"); keywordTermQuery.setTerm(ColumnValue.fromString("ECS")); // Condition 2: The col_long_array field contains an element equal to 2024. TermQuery longTermQuery = new TermQuery(); longTermQuery.setFieldName("col_long_array"); longTermQuery.setTerm(ColumnValue.fromLong(2024l)); SearchQuery searchQuery = new SearchQuery(); // Require both conditions to be true. BoolQuery boolQuery = new BoolQuery(); boolQuery.setMustQueries(Arrays.asList(keywordTermQuery, longTermQuery)); searchQuery.setQuery(boolQuery); //searchQuery.setGetTotalCount(true); // Set to return the total number of matched rows. SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery); // You can configure the columnsToGet parameter to specify the columns to return or return all columns. If this parameter is not configured, only primary key columns are returned by default. //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); //columnsToGet.setReturnAll(true); // Set to return all columns. //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set to return specified columns. //searchRequest.setColumnsToGet(columnsToGet); SearchResponse resp = client.search(searchRequest); //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows. System.out.println("Row: " + resp.getRows()); }
Tipo de dato Nested
El tipo Nested representa documentos anidados. Una fila de datos (documento) puede contener varias filas secundarias (documentos secundarios) almacenadas en un campo anidado. Este tipo es adecuado para almacenar datos jerárquicos.
Especifique el esquema de las filas secundarias en un campo anidado, incluidos los campos y propiedades de cada fila. El tipo Nested admite múltiples valores y es similar al tipo de datos JSON.
Formatos Nested
Los campos anidados se clasifican en tipos de un solo nivel y multinivel.
|
Tipo de anidamiento |
Descripción |
|
Tipo anidado de un solo nivel |
Contiene una capa de estructura de datos anidada con una jerarquía básica. Adecuado para escenarios que requieren relaciones padre-hijo simples sin múltiples niveles. Ejemplo:
|
|
Tipo anidado multinivel |
Contiene múltiples capas de estructuras de datos anidadas con una jerarquía compleja. Recomendado para modelos de datos que exigen jerarquías detalladas y un alto grado de modularidad. Ejemplo:
|
Notas de uso
Para los campos de tipo Nested en un índice de búsqueda, el campo correspondiente en la tabla de datos debe ser de tipo String, y el campo en el índice de búsqueda debe ser de tipo Nested. Utilice consultas anidadas para consultar campos de tipo Nested.
Al escribir datos en la tabla de datos, formatee el valor del campo anidado como un array JSON de objetos. Por ejemplo, [{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}].
Escriba siempre los datos como una cadena de array JSON en un campo anidado, incluso si el campo contiene solo una fila secundaria.
Ejemplos
Ejemplo de campos Nested de un solo nivel
Cree un campo Nested de un solo nivel en la consola de Tablestore o mediante un SDK de Tablestore.
El siguiente ejemplo de código Java muestra cómo crear un campo anidado llamado tags. Las filas secundarias contienen los siguientes tres campos.
Nombre del campo: tagName. Tipo de campo: Keyword.
Nombre del campo: score. Tipo de campo: Double.
Nombre del campo: time. Tipo de campo: Date. Unidad: milisegundos.
Los datos de muestra escritos en la tabla de datos son [{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}].
// Create FieldSchema objects for the fields in a child row.
List<FieldSchema> subFieldSchemas = new ArrayList<FieldSchema>();
subFieldSchemas.add(new FieldSchema("tagName", FieldType.KEYWORD)
.setIndex(true).setEnableSortAndAgg(true));
subFieldSchemas.add(new FieldSchema("score", FieldType.DOUBLE)
.setIndex(true).setEnableSortAndAgg(true));
subFieldSchemas.add(new FieldSchema("time", FieldType.DATE)
.setDateFormats(Arrays.asList("epoch_millis")));
// Set the child row FieldSchema objects to the subFieldSchemas of the nested field.
FieldSchema nestedFieldSchema = new FieldSchema("tags", FieldType.NESTED)
.setSubFieldSchemas(subFieldSchemas);
Ejemplo de campos Nested multinivel
Cree un campo Nested multinivel mediante un SDK de Tablestore.
El siguiente ejemplo utiliza el SDK de Tablestore para Java con el fin de crear un campo Nested llamado user. Cada fila secundaria contiene cuatro campos de tipo primitivo y un campo Nested.
Nombre del campo: name. Tipo de campo: Keyword.
Nombre del campo: age. Tipo de campo: Long.
Nombre del campo: birth. Tipo de campo: Date. Formato de valor: cadena de fecha.
Nombre del campo: phone. Tipo de campo: Keyword.
Nombre del campo anidado: address. Campos de la fila secundaria: province, city y street. Tipo de datos: Keyword para todos los campos.
Datos de muestra para escribir en la tabla de datos: [ {"name":"Zhang San","age":20,"birth":"2014-10-10 12:00:00.000","phone":"1390000****","address":[{"province":"Zhejiang Province","city":"Hangzhou City","street":"No. 1201, Xingfu Community, Sunshine Avenue"}]}]
// Define subfield schemas for the 'address' nested field. The query path for these fields is user.address.
List<FieldSchema> addressSubFiledSchemas = new ArrayList<>();
addressSubFiledSchemas.add(new FieldSchema("province",FieldType.KEYWORD));
addressSubFiledSchemas.add(new FieldSchema("city",FieldType.KEYWORD));
addressSubFiledSchemas.add(new FieldSchema("street",FieldType.KEYWORD));
// Define subfield schemas for the 'user' nested field. Each child row contains four primitive type fields and one nested field 'address'.
List<FieldSchema> subFieldSchemas = new ArrayList<>();
subFieldSchemas.add(new FieldSchema("name",FieldType.KEYWORD));
subFieldSchemas.add(new FieldSchema("age",FieldType.LONG));
subFieldSchemas.add(new FieldSchema("birth",FieldType.DATE).setDateFormats(Arrays.asList("yyyy-MM-dd HH:mm:ss.SSS")));
subFieldSchemas.add(new FieldSchema("phone",FieldType.KEYWORD));
subFieldSchemas.add(new FieldSchema("address",FieldType.NESTED).setSubFieldSchemas(addressSubFiledSchemas));
// Add the 'user' nested field schema to the list of main field schemas.
List<FieldSchema> fieldSchemas = new ArrayList<>();
fieldSchemas.add(new FieldSchema("user",FieldType.NESTED).setSubFieldSchemas(subFieldSchemas));
Límites
Los índices de búsqueda que contienen campos Nested no admiten IndexSort, una función que mejora el rendimiento de las consultas en diversos escenarios.
Al paginar resultados de consulta de un índice de búsqueda con campos Nested, especifique un método de ordenamiento en las condiciones de consulta. De lo contrario, Tablestore no devuelve nextToken cuando solo se leen resultados parciales.
Las consultas anidadas ofrecen un rendimiento inferior al de otros tipos de consultas.
Además de estos límites, el tipo Nested admite todos los tipos de consulta, ordenamiento y agregación.
Referencias
Search Index admite varios tipos de consulta para búsquedas de datos multidimensionales, incluidas term query, terms query, match all query, match query, phrase match query, range query, prefix query, suffix query, wildcard query, token-based wildcard query, boolean query, geo query, nested query, vector search, y exists query.
Al consultar datos, puede sort and paginate el conjunto de resultados o realizar collapsing (deduplication).
Para el análisis de datos, como encontrar el valor máximo o mínimo, calcular una suma o contar filas, puede utilizar las funciones statistical aggregation o SQL query.
Para exportar datos rápidamente sin importar el orden del conjunto de resultados, puede utilizar la función Parallel Scan.