SDKs
SDK de Go
Instala y usa el SDK aacsearch-go para búsqueda, gestión de índices, sinónimos, curadurías y analíticas.
SDK de Go (aacsearch-go)
El módulo github.com/aacsearch/aacsearch-go de Go proporciona dos clientes:
| Cliente | Ámbito | Prefijo de clave | Caso de uso |
|---|---|---|---|
SearchClient | solo búsqueda | ss_search_* | Búsqueda pública desde servicios backend |
AdminClient | CRUD completo | aa_admin_* | Gestión del lado servidor, herramientas CLI |
Instalación
go get github.com/aacsearch/aacsearch-goRequiere Go 1.21+.
Inicio rápido
SearchClient (público)
Úsalo con una clave API de ámbito de búsqueda (ss_search_*).
package main
import (
"log"
"github.com/aacsearch/aacsearch-go"
)
func main() {
client, err := aacsearch.NewSearchClient(aacsearch.SearchClientOptions{
BaseURL: "https://app.aacsearch.com",
APIKey: "ss_search_...",
IndexSlug: "products",
})
if err != nil {
log.Fatal(err)
}
// Búsqueda básica
result, err := client.Search(aacsearch.SearchParams{Q: "laptop"})
if err != nil {
log.Fatal(err)
}
log.Printf("Se encontraron %d resultados", result.Found)
// Búsqueda múltiple
results, err := client.MultiSearch([]aacsearch.SearchParams{
{Q: "nike", QueryBy: "title"},
{Q: "adidas", QueryBy: "title", FilterBy: "in_stock:=true"},
})
if err != nil {
log.Fatal(err)
}
log.Printf("Se obtuvieron %d conjuntos de resultados", len(results.Results))
}AdminClient (lado servidor)
Úsalo con una clave API de ámbito de administración (aa_admin_*). Nunca la incluyas en código de navegador.
package main
import (
"log"
"github.com/aacsearch/aacsearch-go"
)
func boolPtr(b bool) *bool { return &b }
func main() {
admin, err := aacsearch.NewAdminClient(aacsearch.AdminClientOptions{
BaseURL: "https://app.aacsearch.com",
APIKey: "aa_admin_...",
ProjectID: "org_xxx",
})
if err != nil {
log.Fatal(err)
}
// Crear un índice
index, err := admin.CreateIndex(aacsearch.CreateIndexInput{
Slug: "products",
DisplayName: "Products",
Fields: []aacsearch.FieldDefinition{
{Name: "title", Type: "string"},
{Name: "price", Type: "float", Facet: boolPtr(true)},
{Name: "category", Type: "string", Facet: boolPtr(true)},
},
DefaultSortingField: "price",
})
if err != nil {
log.Fatal(err)
}
log.Printf("Índice creado: %s", index.ID)
// Inserción/actualización por lotes de documentos
_, err = admin.BatchUpsertDocuments(index.ID, []map[string]interface{}{
{"id": "doc_1", "title": "Running Shoes", "price": 89.99},
{"id": "doc_2", "title": "T-Shirt", "price": 29.99},
})
if err != nil {
log.Fatal(err)
}
// Listar índices
indexes, err := admin.ListIndexes()
// Obtener analíticas
analytics, err := admin.GetAnalytics("7d")
log.Printf("Búsquedas totales: %d, CTR: %.2f", analytics.TotalSearches, analytics.CTR)
// Crear clave API
key, err := admin.CreateKey(aacsearch.CreateKeyInput{
Name: "My Search Key",
Scopes: []aacsearch.KeyScope{aacsearch.KeyScopeSearch},
IndexSlug: "products",
})
log.Printf("Clave creada: %s...", key.Prefix[:8])
}Manejo de errores
import (
"errors"
"github.com/aacsearch/aacsearch-go"
)
result, err := client.Search(aacsearch.SearchParams{Q: "laptop"})
if err != nil {
var sdkErr *aacsearch.SDKError
if errors.As(err, &sdkErr) {
switch sdkErr.Code {
case "rate_limited":
// Esperar y reintentar
case "unauthorized":
// La clave API no es válida
case "not_found":
// Índice no encontrado
default:
log.Printf("Error %d: %s", sdkErr.Status, sdkErr.Message)
}
}
}Referencia de la API
| Categoría | Métodos |
|---|---|
| Proyecto | GetProject, CreateProject, GetProjectByID |
| Gestión de índices | ListIndexes, GetIndex, CreateIndex, UpdateIndex, DeleteIndex, GetIndexStats |
| Documentos | ListDocuments, UpsertDocument, BatchUpsertDocuments, DeleteDocument, BatchDeleteDocuments |
| Búsqueda | Search, MultiSearch |
| Claves API | ListKeys, CreateKey, RevokeKey |
| Analíticas | GetAnalytics, GetUsage |
| Sinónimos | ListSynonyms, CreateSynonym, UpsertSynonyms, DeleteSynonym |
| Curadurías | ListCurations, CreateCuration, UpsertCurations, DeleteCuration |
| Campos de orden | ListSortingFields, CreateSortingField, ReplaceSortingFields, DeleteSortingField |
| Facetas | ListFacets |