Os índices de busca suportam os tipos de dados Array e Nested, além de tipos primitivos como Long, Double, Boolean, Keyword, Text, Date, GeoPoint, Vector, IP e JSON. Use o tipo Array para armazenar vários valores do mesmo tipo e o tipo Nested para armazenar dados hierárquicos semelhantes ao JSON.
Tipo de dados Array
O tipo de dados Array aplica-se exclusivamente a índices de busca. Tabelas de dados não suportam esse tipo.
Consulte um campo Array da mesma forma que um campo não Array. O sistema retorna uma linha se pelo menos um valor no array atender à condição da consulta.
O tipo de dados Vector não suporta arrays.
O tipo Array funciona como um modificador combinado com tipos primitivos, como Long, Double, Boolean, Keyword, Text, Date, IP e GeoPoint. Por exemplo, combinar o tipo Array com o tipo Long cria um array de inteiros longos que armazena múltiplos valores desse tipo.
Formatos de Array
A tabela a seguir descreve os formatos de array para tipos de dados primitivos em índices de busca.
|
Tipo de Array |
Descrição |
|
Long Array |
Array de inteiros longos. Exemplo: |
|
Double Array |
Array de números de ponto flutuante. Exemplo: |
|
Boolean Array |
Array de valores booleanos. Exemplo: |
|
Keyword Array |
Array de strings no formato JSON. Exemplo: |
|
Text Array |
Array de texto no formato JSON. Exemplo: Arrays de texto são raramente usados. |
|
Date Array |
Array de datas. Se o tipo de data for um inteiro, o formato será |
|
IP Array |
Array de endereços IP no formato JSON. Exemplo: |
|
Geopoint Array |
Array de pontos geográficos. Exemplo: |
Observações de uso
Para campos do tipo Array em um índice de busca, o campo correspondente na tabela de dados deve ser do tipo String, e o campo no índice de busca deve ser do tipo primitivo correspondente, como Long ou Double.
Por exemplo, se o campo price for do tipo Double Array, o campo price na tabela de dados deverá ser do tipo String. No índice de busca, defina o tipo do campo como Double e adicione a propriedade isArray=true.
Exemplos
Considere uma tabela de dados chamada array_search_table contendo os seguintes dados de amostra.
A tabela de dados inclui a coluna de chave primáriapk(tipo String) e duas colunas de atributo:col_keyword_array(tipo String) ecol_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] |
-
Crie um índice de busca.
Crie um índice de busca chamado
array_query_table_index. O índice inclui duas colunas:col_keyword_array(tipo String Array) ecol_long_array(tipo Long Array).Em Schema Generation Method, selecione Auto-generate. Em seguida, na tabela de configuração de campos, verifique se o alternador Array está ativado para os campos correspondentes.
-
Consulte dados do tipo Array usando o índice de busca.
O código Java a seguir consulta dados de array em que a coluna
col_keyword_arraycontém um elemento correspondente exatamente a "Cloud server" e a colunacol_long_arraycontém um elemento igual a 2024.NotaPara consultar dados do tipo Array em um índice de busca por meio de instruções SQL, consulte Executar instruções SQL para consultar dados usando o índice de busca.
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 dados Nested
O tipo Nested representa documentos aninhados. Uma linha de dados (documento) pode conter várias linhas filhas (documentos filhos) armazenadas em um campo aninhado. Esse tipo é adequado para armazenar dados hierárquicos.
Especifique o esquema das linhas filhas em um campo aninhado, incluindo os campos e as propriedades de cada linha filha. O tipo Nested aceita múltiplos valores e assemelha-se ao tipo de dados JSON.
Formatos Nested
Os campos Nested dividem-se em tipos de nível único e multinível.
|
Tipo de aninhamento |
Descrição |
|
Tipo aninhado de nível único |
Contém uma camada de estrutura de dados aninhada com hierarquia básica. Adequado para cenários que exigem relações pai-filho simples, sem múltiplos níveis. Exemplo:
|
|
Tipo aninhado multinível |
Possui múltiplas camadas de estruturas de dados aninhadas com hierarquia complexa. Recomendado para modelos de dados que demandam hierarquias ricas e alto grau de modularidade. Exemplo:
|
Observações de uso
Para campos do tipo Nested em um índice de busca, o campo correspondente na tabela de dados deve ser do tipo String, e o campo no índice de busca deve ser do tipo Nested. Use consultas aninhadas para pesquisar campos do tipo Nested.
Ao gravar dados na tabela de dados, formate o valor do campo aninhado como um array JSON de objetos. Por exemplo, [{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}].
Sempre grave os dados como uma string de array JSON em um campo aninhado, mesmo que o campo contenha apenas uma linha filha.
Exemplos
Exemplo de campos Nested de nível único
Crie um campo Nested de nível único no console do Tablestore ou usando um SDK do Tablestore.
O exemplo de código Java a seguir demonstra como criar um campo aninhado chamado tags. As linhas filhas contêm os três campos listados abaixo.
Nome do campo: tagName. Tipo do campo: Keyword.
Nome do campo: score. Tipo do campo: Double.
Nome do campo: time. Tipo do campo: Date. Unidade: milissegundos.
Os dados de amostra gravados na tabela de dados são [{"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);
Exemplo de campos Nested multinível
Crie um campo Nested multinível usando um SDK do Tablestore.
O exemplo a seguir usa o SDK do Tablestore para Java para criar um campo Nested chamado user. Cada linha filha contém quatro campos de tipo primitivo e um campo Nested.
Nome do campo: name. Tipo do campo: Keyword.
Nome do campo: age. Tipo do campo: Long.
Nome do campo: birth. Tipo do campo: Date. Formato do valor: string de data.
Nome do campo: phone. Tipo do campo: Keyword.
Nome do campo aninhado: address. Campos da linha filha: province, city e street. Tipo de dados: Keyword para todos os campos.
Dados de amostra para gravar na tabela de dados: [ {"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));
Limites
Índices de busca com campos Nested não suportam IndexSort, recurso que melhora o desempenho de consultas em diversos cenários.
Ao paginar resultados de consulta em um índice de busca com campos Nested, especifique um método de ordenação nas condições da consulta. Caso contrário, o Tablestore não retornará nextToken quando apenas resultados parciais forem lidos.
Consultas aninhadas apresentam desempenho inferior ao de outros tipos de consulta.
Exceto por essas limitações, o tipo Nested suporta todos os tipos de consulta, ordenação e agregação.
Referências
O Search Index oferece suporte a vários tipos de consulta para pesquisas multidimensionais de dados, incluindo consulta de termo, consulta de termos, consulta match all, consulta match, consulta phrase match, consulta de intervalo, consulta de prefixo, consulta de sufixo, consulta wildcard, consulta wildcard baseada em token, consulta booleana, consulta geográfica, consulta aninhada, busca vetorial e consulta exists.
Durante a consulta de dados, você pode ordenar e paginar o conjunto de resultados ou executar colapso (deduplicação).
Para análise de dados, como encontrar o valor máximo ou mínimo, calcular somas ou contar linhas, use os recursos de agregação estatística ou consulta SQL.
Para exportar dados rapidamente, independentemente da ordem do conjunto de resultados, use o recurso Parallel Scan.