API for rebuilding search index

This commit is contained in:
2025-12-06 16:32:32 +08:00
parent fbe8ac27bf
commit fd86d6c221
5 changed files with 59 additions and 6 deletions

View File

@@ -33,3 +33,6 @@ BACKUP_RETENTION_DAYS=30
# Download Configuration
DOWNLOAD_SECRET_KEY=your_download_secret_key_here
# Access Key for Development API
DEV_ACCESS_KEY=your_dev_access_key_here

View File

@@ -3,12 +3,27 @@ package api
import (
"nysoure/server/middleware"
"nysoure/server/search"
"github.com/gofiber/fiber/v3"
)
func rebuildSearchIndex(c fiber.Ctx) error {
err := search.RebuildSearchIndex()
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "Failed to rebuild search index: " + err.Error(),
})
}
return c.JSON(fiber.Map{
"message": "Search index rebuilt successfully",
})
}
func AddDevAPI(router fiber.Router) {
devGroup := router.Group("/dev")
devGroup.Use(middleware.DevMiddleware())
{
devGroup.Use(middleware.DevMiddleware())
devGroup.Post("/rebuild_search_index", rebuildSearchIndex)
}
}

View File

@@ -287,7 +287,11 @@ func handleGetCharactersFromVndb(c fiber.Ctx) error {
if vnID == "" {
return model.NewRequestError("VNDB ID is required")
}
characters, err := service.GetCharactersFromVndb(vnID)
uid, ok := c.Locals("uid").(uint)
if !ok {
return model.NewUnAuthorizedError("You must be logged in to get characters from VNDB")
}
characters, err := service.GetCharactersFromVndb(vnID, uid)
if err != nil {
return err
}

View File

@@ -6,12 +6,19 @@ import (
"nysoure/server/dao"
"nysoure/server/model"
"nysoure/server/utils"
"os"
"strconv"
"sync"
"time"
"github.com/blevesearch/bleve"
)
var (
index bleve.Index
mu = sync.RWMutex{}
)
type ResourceParams struct {
Id uint
Title string
@@ -26,9 +33,9 @@ type ResourceCharacter struct {
CV string
}
var index bleve.Index
func AddResourceToIndex(r model.Resource) error {
mu.RLock()
defer mu.RUnlock()
cs := make([]ResourceCharacter, 0, len(r.Characters))
for _, c := range r.Characters {
cs = append(cs, ResourceCharacter{
@@ -96,6 +103,8 @@ func init() {
}
func SearchResource(keyword string) ([]uint, error) {
mu.RLock()
defer mu.RUnlock()
query := bleve.NewMatchQuery(keyword)
searchRequest := bleve.NewSearchRequest(query)
searchResults, err := index.Search(searchRequest)
@@ -128,3 +137,17 @@ func IsStopWord(word string) bool {
tokens := analyzer.Analyze([]byte(word))
return len(tokens) == 0
}
func RebuildSearchIndex() error {
mu.Lock()
defer mu.Unlock()
err := index.Close()
if err != nil {
return fmt.Errorf("failed to close search index: %w", err)
}
err = os.Remove(utils.GetStoragePath() + "/resource_index.bleve")
if err != nil {
return fmt.Errorf("failed to remove search index: %w", err)
}
return createIndex()
}

View File

@@ -615,7 +615,15 @@ func GetPinnedResources() ([]model.ResourceView, error) {
return views, nil
}
func GetCharactersFromVndb(vnID string) ([]CharacterParams, error) {
func GetCharactersFromVndb(vnID string, uid uint) ([]CharacterParams, error) {
canUpload, err := checkUserCanUpload(uid)
if err != nil {
return nil, err
}
if !canUpload {
return nil, model.NewUnAuthorizedError("You have not permission to fetch characters from VNDB")
}
client := http.Client{}
jsonStr := fmt.Sprintf(`
{