Use o método CreateSearchIndex para criar um índice de pesquisa em uma tabela de dados. Uma tabela pode ter vários índices de pesquisa. Ao criar um índice, adicione os campos que deseja consultar. Também é possível configurar opções avançadas, como campos de roteamento e pré-ordenação.
Pré-requisitos
Cliente do Tablestore inicializado. Para mais informações, consulte Inicializar o cliente do Tablestore.
-
Tabela de dados criada que atenda aos seguintes requisitos. Para mais informações, consulte Criar uma tabela de dados.
Número máximo de versões definido como 1.
Tempo de vida (TTL) definido como -1 ou atualizações desativadas para a tabela de dados.
Observações de uso
O tipo de dados de um campo no índice de pesquisa deve corresponder ao tipo de dados do campo equivalente na tabela de dados.
Para definir um TTL diferente de -1 no índice de pesquisa, desative as atualizações na tabela de dados. O TTL do índice de pesquisa deve ser menor ou igual ao TTL da tabela. Para mais informações, consulte Gerenciamento de ciclo de vida.
Parâmetros
Para criar um índice de pesquisa, especifique o nome da tabela (TableName), o nome do índice de pesquisa (IndexName) e o esquema do índice (IndexSchema). O parâmetro IndexSchema inclui FieldSchemas (configurações de campo), IndexSetting (configurações do índice) e IndexSort (configurações de pré-ordenação). A tabela a seguir descreve esses parâmetros.
|
Parâmetro |
Descrição |
|
TableName |
Nome da tabela de dados. |
|
IndexName |
Nome do índice de pesquisa. |
|
FieldSchemas |
Lista de objetos FieldSchema. Cada objeto contém os seguintes parâmetros:
|
|
IndexSetting |
Configurações do índice. Inclui a configuração RoutingFields. RoutingFields (Opcional): Campos de roteamento personalizados. Selecione algumas colunas de chave primária como campos de roteamento. Normalmente, basta definir apenas um. Se houver várias chaves de roteamento, o sistema concatenará seus valores em um único valor. Ao gravar dados no índice, o sistema determina a partição com base nos valores dos campos de roteamento. Registros com os mesmos valores de campo de roteamento ficam armazenados na mesma partição de dados. |
|
IndexSort |
Configurações de pré-ordenação do índice. Inclui a configuração Sorters. Padrão: ordenação por chave primária. Nota
Índices de pesquisa com campos do tipo Nested não suportam IndexSort nem possuem pré-ordenação. Sorters (Obrigatório): Método de pré-ordenação para o índice. Suporta ordenação por chave primária ou por valor de campo. Para mais informações, consulte Ordenação e paginação.
|
|
TimeToLive |
Opcional. Tempo de vida (TTL) dos dados no índice de pesquisa. Unidade: segundos. Valor padrão: -1 (dados nunca expiram). Valor mínimo: 86400 (um dia). Defina como -1 para evitar a expiração dos dados. O Tablestore exclui automaticamente os dados expirados assim que o período de retenção ultrapassa o TTL. Para mais informações sobre o ciclo de vida do índice de pesquisa, consulte Gerenciamento de ciclo de vida. |
Exemplos
Criar um índice de pesquisa com configurações padrão
O exemplo a seguir cria um índice de pesquisa com três colunas: col_keyword (tipo Keyword), col_long (tipo Long) e col_vector (tipo Vector).
func createSearchIndex(client *tablestore.TableStoreClient) {
request := &tablestore.CreateSearchIndexRequest{}
request.TableName = "<TABLE_NAME>"
request.IndexName = "<SEARCH_INDEX_NAME>"
request.IndexSchema = &tablestore.IndexSchema{
FieldSchemas: []*tablestore.FieldSchema{
{
FieldName: proto.String("col_keyword"),
FieldType: tablestore.FieldType_KEYWORD, // String type
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("col_long"),
FieldType: tablestore.FieldType_LONG, // Numeric type
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("col_vector"),
FieldType: tablestore.FieldType_VECTOR, // Vector type
Index: proto.Bool(true),
VectorOptions: &tablestore.VectorOptions{
VectorDataType: tablestore.VectorDataType_FLOAT_32.Enum(),
Dimension: proto.Int32(4), // The vector dimension is 4, and the similarity algorithm is dot product.
VectorMetricType: tablestore.VectorMetricType_DOT_PRODUCT.Enum(),
},
},
},
}
_, err := client.CreateSearchIndex(request)
if err != nil {
fmt.Println("Failed to create searchIndex with error:", err)
return
}
}
Criar um índice de pesquisa com IndexSort
O exemplo a seguir cria um índice de pesquisa com pré-ordenação configurada. O índice contém duas colunas: col1 (tipo Keyword) e col2 (tipo Long).
func createSearchIndex_withIndexSort(client *tablestore.TableStoreClient){
request := &tablestore.CreateSearchIndexRequest{}
request.TableName = "<TABLE_NAME>" // Set the table name.
request.IndexName = "<SEARCH_INDEX_NAME>" // Set the search index name.
schemas := []*tablestore.FieldSchema{}
field1 := &tablestore.FieldSchema{
FieldName: proto.String("col1"), // Set the field name. Use proto.String to get the string pointer.
FieldType: tablestore.FieldType_KEYWORD, // Set the field type.
Index: proto.Bool(true), // Enable indexing.
EnableSortAndAgg: proto.Bool(true), // Enable sorting and statistical aggregation.
}
field2 := &tablestore.FieldSchema{
FieldName: proto.String("col2"),
FieldType: tablestore.FieldType_LONG,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
}
schemas = append(schemas, field1, field2)
request.IndexSchema = &tablestore.IndexSchema{
FieldSchemas: schemas, // Set the fields to include in the search index.
IndexSort: &search.Sort{ // Specify index pre-sorting. Sort by col2 in ascending order, then by col1 in descending order.
Sorters: []search.Sorter{
&search.FieldSort{
FieldName: "col2",
Order: search.SortOrder_ASC.Enum(),
},
&search.FieldSort{
FieldName: "col1",
Order: search.SortOrder_DESC.Enum(),
},
},
},
}
resp, err := client.CreateSearchIndex(request) // Call the client to create the search index.
if err != nil {
fmt.Println("error :", err)
return
}
fmt.Println("CreateSearchIndex finished, requestId:", resp.ResponseInfo.RequestId)
}
Criar um índice de pesquisa com TTL
Certifique-se de que as atualizações estejam desativadas para a tabela de dados.
func createIndexWithTTL(client *tablestore.TableStoreClient) {
request := &tablestore.CreateSearchIndexRequest{}
request.TableName = "<TABLE_NAME>"
request.IndexName = "<SEARCH_INDEX_NAME>"
schemas := []*tablestore.FieldSchema{}
field1 := &tablestore.FieldSchema{
FieldName: proto.String("col1"), // Set the field name. Use proto.String to get the string pointer.
FieldType: tablestore.FieldType_KEYWORD, // Set the field type.
Index: proto.Bool(true), // Enable indexing.
EnableSortAndAgg: proto.Bool(true), // Enable sorting and statistical aggregation.
}
field2 := &tablestore.FieldSchema{
FieldName: proto.String("col2"),
FieldType: tablestore.FieldType_LONG,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
}
schemas = append(schemas, field1, field2)
request.IndexSchema = &tablestore.IndexSchema{
FieldSchemas: schemas, // Set the fields to include in the search index.
}
request.TimeToLive = proto.Int32(3600 * 24 * 7) // Set the TTL of the search index to 7 days.
resp, err := client.CreateSearchIndex(request)
if err != nil {
fmt.Println("error :", err)
return
}
fmt.Println("createIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId)
}
Criar um índice de pesquisa com destaque de consulta
O exemplo a seguir cria um índice de pesquisa com quatro colunas: col_keyword (tipo Keyword), col_long (tipo Long), col_text (tipo Text) e col_nested (tipo Nested). A coluna col_nested contém duas subcolunas: level1_text (tipo Text) e level1_nested (tipo Nested). A subcoluna level1_nested contém uma subcoluna: level2_text (tipo Text). O destaque de consulta está ativado para col_text, para a subcoluna level1_text de col_nested e para a subcoluna level2_text de col_nested.level1_nested.
func createSearchIndexwithHighlighting(client *tablestore.TableStoreClient) {
request := &tablestore.CreateSearchIndexRequest{}
request.TableName = "<TABLE_NAME>"
request.IndexName = "<SEARCH_INDEX_NAME>"
request.IndexSchema = &tablestore.IndexSchema{
FieldSchemas: []*tablestore.FieldSchema{
{
FieldName: proto.String("col_keyword"),
FieldType: tablestore.FieldType_KEYWORD, // String type.
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("col_long"),
FieldType: tablestore.FieldType_LONG, // Numeric type.
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{// Enable query highlighting for a non-nested type.
FieldName: proto.String("col_text"),
FieldType: tablestore.FieldType_TEXT, // Tokenizable string type.
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
EnableHighlighting: proto.Bool(true),
},
{// Enable query highlighting for sub-columns in a nested type field.
FieldName: proto.String("col_nested"),
FieldType: tablestore.FieldType_NESTED,
FieldSchemas: []*tablestore.FieldSchema{
{
FieldName: proto.String("level1_text"),
FieldType: tablestore.FieldType_TEXT,
Index: proto.Bool(true),
EnableHighlighting: proto.Bool(true),
},
{
FieldName: proto.String("level1_nested"),
FieldType: tablestore.FieldType_NESTED,
FieldSchemas: []*tablestore.FieldSchema{
{
FieldName: proto.String("level2_text"),
FieldType: tablestore.FieldType_TEXT,
Index: proto.Bool(true),
EnableHighlighting: proto.Bool(true),
},
},
},
},
},
},
}
_, err := client.CreateSearchIndex(request)
if err != nil {
fmt.Println("Failed to create searchIndex with error:", err)
return
}
}
Perguntas frequentes
Diferenças entre consultas de intervalo usando as operações GetRange e Search
O Tablestore suporta o armazenamento de dados formatados em JSON?
Dados não encontrados usando a operação Search de um índice de pesquisa
O Tablestore suporta consultas semelhantes a IN e BETWEEN...AND em bancos de dados relacionais?
O erro "field:xx must enable enable_sort_and_agg" ocorre ao usar um índice de pesquisa
Referências
Após criar um índice de pesquisa, use vários tipos de consulta para dados multidimensionais, incluindo consulta de termo, consulta de termos, consulta match all, consulta match, consulta match phrase, consulta de prefixo, consulta de intervalo, consulta curinga, consulta geográfica, consulta booleana, AISearch, consulta aninhada e consulta de existência de coluna.
Durante a consulta de dados, aplique ordenação e paginação, destaque ou colapso (deduplicação) ao conjunto de resultados.
Depois de criar um índice de pesquisa, gerencie-o: modifique dinamicamente o esquema, gerencie o ciclo de vida, liste índices de pesquisa, consulte descrições de índices de pesquisa e exclua um índice de pesquisa.
Para análises de dados, como encontrar valores máximos ou mínimos, calcular somas ou contar linhas, use o recurso de agregação ou de consulta SQL.
Para exportar dados rapidamente sem exigir uma ordem específica no conjunto de resultados, utilize o recurso de varredura paralela.