使用 Go gorm 同步mysql 的数据到 meilisearch 实现增量定时同步功能

9 min read

以下是一个使用 Go gorm 同步 MySQL 数据到 meilisearch 的示例代码。该代码实现了增量定时同步功能,即每隔一定时间从 MySQL 数据库中获取最新的数据并将其同步到 meilisearch 中。代码使用的 meilisearch 客户端是官方提供的 go-meilisearch 客户端。

package main

import (
    "fmt"
    "time"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/meilisearch/meilisearch-go"
)

// 定义 MySQL 中的表结构
type User struct {
    ID   uint   `gorm:"primary_key"`
    Name string `gorm:"type:varchar(100)"`
}

func main() {
    // 连接 MySQL 数据库
    db, err := gorm.Open("mysql", "user:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 连接 meilisearch
    client := meilisearch.NewClient(meilisearch.ClientConfig{
        Host:   "http://localhost:7700",
        APIKey: "mykey",
    })

    // 定义 meilisearch 中的索引
    index := client.Index("users")

    // 每隔一定时间同步一次数据
    for {
        // 获取最新的数据
        var users []User
        db.Find(&users)

        // 将数据同步到 meilisearch 中
        var documents []map[string]interface{}
        for _, user := range users {
            document := map[string]interface{}{
                "id":   user.ID,
                "name": user.Name,
            }
            documents = append(documents, document)
        }
        _, err = index.AddDocuments(documents)
        if err != nil {
            fmt.Println(err)
        }

        // 等待一定时间后继续同步
        time.Sleep(10 * time.Minute)
    }
}

以上代码将每隔 10 分钟从 MySQL 中获取最新的用户数据,并将其同步到名为 "users" 的 meilisearch 索引中。如需修改同步时间或更改索引名称,请相应地调整代码。