Files
toutoukan/controllers/search/search.go
2025-08-13 07:11:17 +08:00

85 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package search
import (
"github.com/blevesearch/bleve/v2"
"github.com/gin-gonic/gin"
"log"
"toutoukan/model/article"
)
var GlobalIndex bleve.Index
func DataSearch(c *gin.Context) {
if GlobalIndex == nil {
c.JSON(500, gin.H{"error": "索引未初始化请先调用InitIndex()"})
return
}
keyword := c.Query("keyword")
if keyword == "" {
c.JSON(400, gin.H{"error": "请提供搜索关键词(?keyword=xxx"})
return
}
query := bleve.NewQueryStringQuery(`title:"` + keyword + `" OR content:"` + keyword + `"`)
searchRequest := bleve.NewSearchRequest(query)
// 只返回必要字段减少资源消耗
searchRequest.Fields = []string{"title", "content"}
searchResult, err := GlobalIndex.Search(searchRequest)
if err != nil {
c.JSON(500, gin.H{"error": "搜索失败: " + err.Error()})
return
}
type Result struct {
ID string `json:"id"`
Score float64 `json:"score"`
Doc *article.Document `json:"doc"`
}
var results []Result
for _, hit := range searchResult.Hits {
doc := &article.Document{}
hasField := false
// 宽松的字段处理逻辑
if title, ok := hit.Fields["title"].(string); ok {
doc.Title = title
hasField = true
} else {
log.Printf("文档 %s 缺少title字段", hit.ID)
}
if content, ok := hit.Fields["content"].(string); ok {
doc.Content = content
hasField = true
} else {
log.Printf("文档 %s 缺少content字段", hit.ID)
}
// 至少有一个字段存在才包含结果
if hasField {
results = append(results, Result{
ID: hit.ID,
Score: hit.Score,
Doc: doc,
})
}
}
// 添加调试信息
if len(results) == 0 {
log.Printf("关键词'%s'搜索返回%d个文档但有效结果为0", keyword, searchResult.Total)
} else {
log.Printf("关键词'%s'搜索返回%d个文档", keyword, searchResult.Total)
}
c.JSON(200, gin.H{
"total": len(results),
"took": searchResult.Took,
"result": results,
})
}