GoFound 與 MySQL 集成優化方案
1. 明確需求
- 文章信息存儲在 MySQL 數據庫中。
- 使用 GoFound 實現全文搜索功能。
- 搜索時,先從 GoFound 中獲取匹配的文章 ID,然后從 MySQL 中查詢完整的文章信息。
2. 優化思路
- 數據同步:將 MySQL 中的文章數據同步到 GoFound 中(文章 ID 和需要檢索的字段,如標題、內容等)。
- 搜索流程:用戶輸入搜索關鍵詞,調用 GoFound 搜索接口,獲取匹配的文章 ID 列表,然后從 MySQL 中查詢完整的文章信息。
- 性能優化:使用緩存(如 Redis)緩存熱門搜索結果,對 GoFound 的搜索結果進行分頁。
3. 代碼優化實現
(1) 數據同步到 GoFound
在文章新增或更新時,將數據同步到 GoFound。
package service
import (
“github.com/newpanjing/gofound”
“gin-vue-admin/global”
“gin-vue-admin/model”
)
type ArticleService struct {
GoFoundClient *gofound.Client
}
func NewArticleService() *ArticleService {
return &ArticleService{
GoFoundClient: global.GoFoundClient,
}
}
// SyncArticleToGoFound 將文章同步到 GoFound
func (s *ArticleService) SyncArticleToGoFound(article *model.Article) error {
doc := gofound.Document{
ID: article.ID, // 文章 ID
Title: article.Title, // 文章標題
Content: article.Content, // 文章內容
}
return s.GoFoundClient.Add(doc)
}
(2) 搜索流程優化
在搜索時,先從 GoFound 獲取文章 ID 列表,再從 MySQL 中查詢完整信息。
package service
import (
“github.com/newpanjing/gofound”
“gin-vue-admin/global”
“gin-vue-admin/model”
)
type SearchService struct {
GoFoundClient *gofound.Client
}
func NewSearchService() *SearchService {
return &SearchService{
GoFoundClient: global.GoFoundClient,
}
}
// SearchArticles 搜索文章
func (s *SearchService) SearchArticles(query string, page, pageSize int) ([]model.Article, error) {
// 從 GoFound 中搜索
results, err := s.GoFoundClient.Search(query, pageSize, (page-1)*pageSize)
if err != nil {
return nil, err
}
// 提取文章 ID 列表
var articleIDs []uint
for _, result := range results {articleIDs = append(articleIDs, uint(result.ID))
}// 從 MySQL 中查詢完整文章信息
var articles []model.Article
if err := global.GVA_DB.Where("id IN ?", articleIDs).Find(&articles).Error; err != nil {return nil, err
}return articles, nil
}
(3) 控制器調用搜索服務
在控制器中調用 SearchService,并返回搜索結果。
package api
import (
“github.com/gin-gonic/gin”
“gin-vue-admin/service”
“net/http”
“strconv”
)
type SearchApi struct {
SearchService *service.SearchService
}
func NewSearchApi() *SearchApi {
return &SearchApi{
SearchService: service.NewSearchService(),
}
}
func (s *SearchApi) SearchArticles(c *gin.Context) {
query := c.Query(“q”)
page, _ := strconv.Atoi(c.DefaultQuery(“page”, “1”))
pageSize, _ := strconv.Atoi(c.DefaultQuery(“pageSize”, “10”))
articles, err := s.SearchService.SearchArticles(query, page, pageSize)
if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return
}c.JSON(http.StatusOK, gin.H{"data": articles})
}
(4) 注冊路由
在 router.go 中注冊搜索路由。
package router
import (
“github.com/gin-gonic/gin”
“gin-vue-admin/api”
)
func InitRouter() *gin.Engine {
r := gin.Default()
searchApi := api.NewSearchApi()
r.GET("/search/articles", searchApi.SearchArticles)return r
}
(5) 前端調用
在前端 Vue 項目中調用搜索接口,并展示結果。
<template><div><input v-model="query" @input="search" placeholder="Search articles..."><ul><li v-for="article in articles" :key="article.id"><h3>{{ article.title }}</h3><p>{{ article.content }}</p></li></ul></div>
</template>
<script>
export default {
data() {
return {
query: ‘’,
articles: []
};
},
methods: {
async search() {
const response = await this.$http.get(‘/search/articles’, {
params: { q: this.query }
});
this.articles = response.data.data;
}
}
};
</script>
4. 性能優化建議
- 緩存:使用 Redis 緩存熱門搜索關鍵詞及其結果,減少數據庫和 GoFound 的壓力。
- 分頁:在 GoFound 和 MySQL 查詢中都支持分頁,避免一次性加載過多數據。
- 異步同步:使用消息隊列(如 RabbitMQ 或 Kafka)異步同步 MySQL 數據到 GoFound,提高性能。
- 索引優化:在 GoFound 中合理設置索引字段(如標題、內容),提升搜索效率。
5. 總結
通過以上優化,你可以實現從 MySQL 數據庫中檢索文章信息,并利用 GoFound 提供高效的全文搜索功能。代碼結構清晰,易于維護,同時具備良好的擴展性和性能優化空間。