Files
zeekayandHanzo Dev f62ee2198f Go 1.27.1, and the code it can say more simply
Modules declare go 1.27.1 and the build images follow. go fix applied the
modernizers, and the test and example pointer helpers went once new(expr)
could say them; omitzero is not applied, since it changes what the JSON says.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-16 19:12:06 -07:00

195 lines
5.7 KiB
Go

package main
import (
"context"
"fmt"
"log"
"os"
"time"
"github.com/hanzoai/search-go"
)
// User represents a user document
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
Role string `json:"role"`
Active bool `json:"active"`
JoinDate string `json:"join_date"`
}
func main() {
// Initialize the Meilisearch client
host := getenv("MEILI_HOST", "http://localhost:7700")
apiKey := os.Getenv("MEILI_API_KEY")
client := meilisearch.New(host, meilisearch.WithAPIKey(apiKey))
defer client.Close()
// Test connection
fmt.Println("Testing connection to Meilisearch...")
if !client.IsHealthy() {
log.Fatal("Meilisearch is not available")
}
fmt.Println("āœ… Connected to Meilisearch")
// Create index for document operations
indexUID := "users"
if err := createIndex(client, indexUID); err != nil {
log.Fatalf("Failed to create index: %v", err)
}
index := client.Index(indexUID)
fmt.Println("\nšŸ“„ Document Management Examples")
fmt.Println("===============================")
// 1. Add documents (batch)
fmt.Println("1. Adding documents in batch:")
users := []User{
{ID: 1, Name: "Alice Johnson", Email: "[email protected]", Role: "admin", Active: true, JoinDate: "2023-01-15"},
{ID: 2, Name: "Bob Smith", Email: "[email protected]", Role: "user", Active: true, JoinDate: "2023-02-20"},
{ID: 3, Name: "Charlie Brown", Email: "[email protected]", Role: "moderator", Active: false, JoinDate: "2023-03-10"},
}
task, err := index.AddDocuments(users, &meilisearch.DocumentOptions{PrimaryKey: new("id")})
if err != nil {
log.Fatalf("Failed to add documents: %v", err)
}
if err := waitForTask(client, task.TaskUID); err != nil {
log.Fatalf("Failed to wait for add task: %v", err)
}
fmt.Printf("āœ… Added %d documents (Task ID: %d)\n", len(users), task.TaskUID)
// 2. Add single document
fmt.Println("\n2. Adding single document:")
newUser := User{
ID: 4,
Name: "Diana Prince",
Email: "[email protected]",
Role: "user",
Active: true,
JoinDate: "2023-04-05",
}
task, err = index.AddDocuments([]User{newUser}, nil)
if err != nil {
log.Fatalf("Failed to add single document: %v", err)
}
if err := waitForTask(client, task.TaskUID); err != nil {
log.Fatalf("Failed to wait for add task: %v", err)
}
fmt.Printf("āœ… Added single document (Task ID: %d)\n", task.TaskUID)
// 3. Update documents
fmt.Println("\n3. Updating documents:")
updatedUsers := []User{
{ID: 2, Name: "Bob Smith Jr.", Email: "[email protected]", Role: "admin", Active: true, JoinDate: "2023-02-20"},
{ID: 3, Name: "Charlie Brown", Email: "[email protected]", Role: "moderator", Active: true, JoinDate: "2023-03-10"}, // Activating user
}
task, err = index.UpdateDocuments(updatedUsers, nil)
if err != nil {
log.Fatalf("Failed to update documents: %v", err)
}
if err := waitForTask(client, task.TaskUID); err != nil {
log.Fatalf("Failed to wait for update task: %v", err)
}
fmt.Printf("āœ… Updated %d documents (Task ID: %d)\n", len(updatedUsers), task.TaskUID)
// 4. Get document by ID
fmt.Println("\n4. Getting document by ID:")
var doc User
err = index.GetDocument("2", nil, &doc)
if err != nil {
log.Fatalf("Failed to get document: %v", err)
}
fmt.Printf("Retrieved document: %v\n", doc)
// 5. Get multiple documents
fmt.Println("\n5. Getting multiple documents:")
var docs meilisearch.DocumentsResult
err = index.GetDocuments(&meilisearch.DocumentsQuery{
Limit: 10,
Offset: 0,
}, &docs)
if err != nil {
log.Fatalf("Failed to get documents: %v", err)
}
fmt.Printf("Retrieved %d documents:\n", len(docs.Results))
for i, doc := range docs.Results {
fmt.Printf(" %d. %v\n", i+1, doc)
}
// 6. Delete documents
fmt.Println("\n6. Deleting documents:")
task, err = index.DeleteDocument("4", nil)
if err != nil {
log.Fatalf("Failed to delete document: %v", err)
}
if err := waitForTask(client, task.TaskUID); err != nil {
log.Fatalf("Failed to wait for delete task: %v", err)
}
fmt.Printf("āœ… Deleted document with ID 4 (Task ID: %d)\n", task.TaskUID)
// 7. Delete multiple documents
fmt.Println("\n7. Deleting multiple documents:")
task, err = index.DeleteDocuments([]string{"1", "3"}, nil)
if err != nil {
log.Fatalf("Failed to delete documents: %v", err)
}
if err := waitForTask(client, task.TaskUID); err != nil {
log.Fatalf("Failed to wait for delete task: %v", err)
}
fmt.Printf("āœ… Deleted multiple documents (Task ID: %d)\n", task.TaskUID)
// 8. Final document count
fmt.Println("\n8. Final document count:")
var finalDocs meilisearch.DocumentsResult
err = index.GetDocuments(&meilisearch.DocumentsQuery{Limit: 100}, &finalDocs)
if err != nil {
log.Fatalf("Failed to get final documents: %v", err)
}
fmt.Printf("Remaining documents: %d\n", len(finalDocs.Results))
fmt.Println("\nDocument management examples completed successfully! šŸŽ‰")
}
func createIndex(client meilisearch.ServiceManager, indexUID string) error {
fmt.Printf("Creating index '%s'...\n", indexUID)
task, err := client.CreateIndex(&meilisearch.IndexConfig{
Uid: indexUID,
PrimaryKey: "id",
})
if err != nil {
log.Printf("Index might already exist: %v", err)
return nil // Continue if index exists
}
return waitForTask(client, task.TaskUID)
}
func waitForTask(client meilisearch.ServiceManager, taskUID int64) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
_, err := client.WaitForTaskWithContext(ctx, taskUID, 100*time.Millisecond)
return err
}
// getenv returns the value of the environment variable named by the key,
// or def if the variable is not present or empty.
func getenv(key, def string) string {
if v := os.Getenv(key); v != "" {
return v
}
return def
}