Os índices de pesquisa aceleram a consulta de índices Lastpoint e oferecem recursos de consulta multidimensional e análise estatística. Este tópico descreve como usar o Tablestore SDK for Go para consultar dados em um índice Lastpoint por meio de um índice de pesquisa.
Observações de uso
O recurso de índice Lastpoint é compatível com o Tablestore SDK for Go V1.7.15 ou posterior. Para usar esse recurso, utilize o Tablestore SDK for Go V1.7.15 ou posterior.
Pré-requisitos
Um índice Lastpoint deve estar criado para uma tabela de séries temporais. Para mais informações, consulte Create a Lastpoint index.
Procedimento
1. Crie um índice de pesquisa
O código de exemplo a seguir demonstra como crie um índice de pesquisa para um índice Lastpoint. Para informações sobre o cenário e os dados de exemplo, consulte Appendix.
No exemplo, o valor do campo _tags é um array de strings composto por tags. Defina o tipo do campo mapeado no índice de pesquisa como um array Keyword, o que facilita a consulta das tags no campo _tags.
func createSearchIndex(client *tablestore.TableStoreClient) {
request := &tablestore.CreateSearchIndexRequest{}
request.TableName = "<LASTPOINT_INDEX_NAME>"
request.IndexName = "<SEARCH_INDEX_NAME>"
request.IndexSchema = &tablestore.IndexSchema{
FieldSchemas: []*tablestore.FieldSchema{
{
FieldName: proto.String("_#h"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("_m_name"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("_data_source"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("_tags"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
IsArray: proto.Bool(true),
},
{
FieldName: proto.String("_time"),
FieldType: tablestore.FieldType_LONG,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("gps"),
FieldType: tablestore.FieldType_GEO_POINT,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("speed"),
FieldType: tablestore.FieldType_DOUBLE,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("status"),
FieldType: tablestore.FieldType_KEYWORD,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("total_mileage"),
FieldType: tablestore.FieldType_LONG,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
{
FieldName: proto.String("remaining_mileage"),
FieldType: tablestore.FieldType_LONG,
Index: proto.Bool(true),
EnableSortAndAgg: proto.Bool(true),
},
},
}
_, err := client.CreateSearchIndex(request)
if err != nil {
fmt.Println("Failed to create searchIndex with error:", err)
return
}
}
2. Consulte dados usando um índice de pesquisa
O código de exemplo a seguir demonstra como usar o recurso de consulta por intervalo (range query) dos índices de pesquisa.
Neste exemplo, o índice de pesquisa recupera as linhas em que o valor do campo speed é maior que 20,0 em um índice Lastpoint.
func RangeQuery(client *tablestore.TableStoreClient, lastpointName string, indexName string) {
searchRequest := &tablestore.SearchRequest{}
searchRequest.SetTableName(lastpointName)
searchRequest.SetIndexName(indexName)
searchQuery := search.NewSearchQuery()
rangeQuery := &search.RangeQuery{} // Set the query type to RangeQuery.
rangeQuery.FieldName = "speed" // Specify the field to match.
rangeQuery.GT(20.0) // Specify the query condition for the field. Only rows in which the value of the field is greater than 20.0 meet the query condition.
searchQuery.SetQuery(rangeQuery)
// Specify that the rows that meet the query condition is sorted by the speed column in descending order.
searchQuery.SetSort(&search.Sort{
[]search.Sorter{
&search.FieldSort{
FieldName: "speed",
Order: search.SortOrder_DESC.Enum(),
},
},
})
searchRequest.SetSearchQuery(searchQuery)
searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
ReturnAll: true,
})
searchResponse, err := client.Search(searchRequest)
if err != nil {
fmt.Printf("%#v", err)
return
}
fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // Check whether all rows that meet the query conditions are returned.
fmt.Println("RowCount: ", len(searchResponse.Rows))
for _, row := range searchResponse.Rows {
jsonBody, err := json.Marshal(row)
if err != nil {
panic(err)
}
fmt.Println("Row: ", string(jsonBody))
}
}
Perguntas frequentes
Referências
Os principais recursos dos índices de pesquisa incluem consulta por colunas de chave primária ou não primária, consulta booleana, consulta geográfica, pesquisa de texto completo, consulta difusa, consulta por prefixo, consulta aninhada, collapse (distinct), ordenação, match all query e agregação. Para mais informações, consulte Features.
Apêndice
No cenário de Internet dos Veículos (IoV), sensores reportam dados de séries temporais dos veículos para a cloud. Os usuários podem armazenar, consultar e analisar esses dados para atender a requisitos de negócio, como relatórios de status do veículo, posicionamento de veículos, gestão de tráfego e espelhamento de tela da trajetória do veículo.
A tabela a seguir apresenta os dados de exemplo em uma tabela de séries temporais.
Neste exemplo, os campos _m_name, _data_source e _tags são identificadores de séries temporais que especificam, respectivamente, o nome da medição, a source de dados e as informações de tag da série temporal. O campo _time indica o momento em que os dados foram reportados. Os campos gps, speed, status, total_mileage e remaining_mileage são dados da série temporal que representam, respectivamente, as coordenadas GPS do veículo, a velocidade, o status, a quilometragem total e a quilometragem restante do veículo.
|
_m_name |
_data_source |
_tags |
_time |
gps |
speed |
status |
total_mileage |
remaining_mileage |
|
Platform A |
sensor1 |
["region=hangzhou","car_model=sedan","number_plate=ZheA D7512*","color=white"] |
1730422800000000 |
30.245853,120.178564 |
0 |
Idle |
20000 |
450 |
|
Platform A |
sensor1 |
["region=hangzhou","car_model=sedan","number_plate=ZheA D7512*","color=white"] |
1730423400000000 |
30.245853,120.178564 |
0 |
Idle |
20000 |
450 |
|
Platform A |
sensor2 |
["region=hangzhou","car_model=suv","number_plate=ZheC 72B2*","color=black"] |
1730779200000000 |
30.245278,120.150269 |
50 |
Active |
15000 |
300 |
|
Platform A |
sensor2 |
["region=hangzhou","car_model=suv","number_plate=ZheC 72B2*","color=black"] |
1730779800000000 |
30.245853,120.213654 |
80 |
Active |
15050 |
250 |
|
Platform B |
sensor3 |
["region=hangzhou","car_model=sedan","number_plate=ZheB 121*9","color=blue"] |
1730862000000000 |
30.246013,120.124470 |
60 |
Active |
18200 |
300 |
|
Platform B |
sensor3 |
["region=hangzhou","car_model=sedan","number_plate=ZheB 121*9","color=blue"] |
1730862600000000 |
30.246022,120.124460 |
0 |
Idle |
18230 |
270 |
O Tablestore sincroniza automaticamente os dados do ponto mais recente das séries temporais na tabela de séries temporais para o índice Lastpoint. A tabela a seguir apresenta os dados de exemplo no índice Lastpoint.
|
_#h |
_m_name |
_data_source |
_tags |
_time |
gps |
speed |
status |
total_mileage |
remaining_mileage |
|
4c#Platform A#07 |
Platform A |
sensor1 |
["region=hangzhou","car_model=sedan","number_plate=ZheA D7512*","color=white"] |
1730423400000000 |
30.245853,120.178564 |
0 |
Idle |
20000 |
450 |
|
25#Platform A#ae |
Platform A |
sensor2 |
["region=hangzhou","car_model=suv","number_plate=ZheC 72B2*","color=black"] |
1730779800000000 |
30.245853,120.213654 |
80 |
Active |
15050 |
250 |
|
b2#Platform B#4b |
Platform B |
sensor3 |
["region=hangzhou","car_model=sedan","number_plate=ZheB 121*9","color=blue"] |
1730862600000000 |
30.246022,120.124460 |
0 |
Idle |
18230 |
270 |