This is an automated email from the ASF dual-hosted git repository.

linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/answer.git

commit 989b2b365009fd8c7e9551613c70adedc69b4039
Author: hgaol <[email protected]>
AuthorDate: Wed Mar 26 17:54:01 2025 +0800

    feat: support using search plugin to search similar question in ask 
question page
---
 cmd/wire_gen.go                              |  8 +++----
 internal/service/content/question_service.go | 34 +++++++++++++++++++++++++++-
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go
index 702f60df..95fba595 100644
--- a/cmd/wire_gen.go
+++ b/cmd/wire_gen.go
@@ -204,7 +204,10 @@ func initApplication(debug bool, serverConf *conf.Server, 
dbConf *data.Database,
        externalNotificationService := 
notification.NewExternalNotificationService(dataData, 
userNotificationConfigRepo, followRepo, emailService, userRepo, 
externalNotificationQueueService, userExternalLoginRepo, siteInfoCommonService)
        reviewRepo := review.NewReviewRepo(dataData)
        reviewService := review2.NewReviewService(reviewRepo, objService, 
userCommon, userRepo, questionRepo, answerRepo, userRoleRelService, 
externalNotificationQueueService, tagCommonService, questionCommon, 
notificationQueueService, siteInfoCommonService)
-       questionService := content.NewQuestionService(activityRepo, 
questionRepo, answerRepo, tagCommonService, tagService, questionCommon, 
userCommon, userRepo, userRoleRelService, revisionService, metaCommonService, 
collectionCommon, answerActivityService, emailService, 
notificationQueueService, externalNotificationQueueService, 
activityQueueService, siteInfoCommonService, externalNotificationService, 
reviewService, configService, eventQueueService, reviewRepo)
+       searchParser := search_parser.NewSearchParser(tagCommonService, 
userCommon)
+       searchRepo := search_common.NewSearchRepo(dataData, uniqueIDRepo, 
userCommon, tagCommonService)
+       searchService := content.NewSearchService(searchParser, searchRepo)
+       questionService := content.NewQuestionService(activityRepo, 
questionRepo, answerRepo, tagCommonService, tagService, questionCommon, 
userCommon, userRepo, userRoleRelService, revisionService, metaCommonService, 
collectionCommon, answerActivityService, emailService, 
notificationQueueService, externalNotificationQueueService, 
activityQueueService, siteInfoCommonService, externalNotificationService, 
reviewService, configService, eventQueueService, reviewRepo, searchService)
        answerService := content.NewAnswerService(answerRepo, questionRepo, 
questionCommon, userCommon, collectionCommon, userRepo, revisionService, 
answerActivityService, answerCommon, voteRepo, emailService, 
userRoleRelService, notificationQueueService, externalNotificationQueueService, 
activityQueueService, reviewService, eventQueueService)
        reportHandle := report_handle.NewReportHandle(questionService, 
answerService, commentService)
        reportService := report2.NewReportService(reportRepo, objService, 
userCommon, answerRepo, questionRepo, commentCommonRepo, reportHandle, 
configService, eventQueueService)
@@ -221,9 +224,6 @@ func initApplication(debug bool, serverConf *conf.Server, 
dbConf *data.Database,
        collectionController := 
controller.NewCollectionController(collectionService)
        questionController := controller.NewQuestionController(questionService, 
answerService, rankService, siteInfoCommonService, captchaService, 
rateLimitMiddleware)
        answerController := controller.NewAnswerController(answerService, 
rankService, captchaService, siteInfoCommonService, rateLimitMiddleware)
-       searchParser := search_parser.NewSearchParser(tagCommonService, 
userCommon)
-       searchRepo := search_common.NewSearchRepo(dataData, uniqueIDRepo, 
userCommon, tagCommonService)
-       searchService := content.NewSearchService(searchParser, searchRepo)
        searchController := controller.NewSearchController(searchService, 
captchaService)
        reviewActivityRepo := activity.NewReviewActivityRepo(dataData, 
activityRepo, userRankRepo, configService)
        contentRevisionService := content.NewRevisionService(revisionRepo, 
userCommon, questionCommon, answerService, objService, questionRepo, 
answerRepo, tagRepo, tagCommonService, notificationQueueService, 
activityQueueService, reportRepo, reviewService, reviewActivityRepo)
diff --git a/internal/service/content/question_service.go 
b/internal/service/content/question_service.go
index cfbe3013..4c4518af 100644
--- a/internal/service/content/question_service.go
+++ b/internal/service/content/question_service.go
@@ -26,6 +26,7 @@ import (
        "time"
 
        "github.com/apache/answer/internal/service/event_queue"
+       "github.com/apache/answer/plugin"
 
        "github.com/apache/answer/internal/base/constant"
        "github.com/apache/answer/internal/base/handler"
@@ -92,6 +93,7 @@ type QuestionService struct {
        configService                    *config.ConfigService
        eventQueueService                event_queue.EventQueueService
        reviewRepo                       review.ReviewRepo
+       searchService                    *SearchService
 }
 
 func NewQuestionService(
@@ -118,6 +120,7 @@ func NewQuestionService(
        configService *config.ConfigService,
        eventQueueService event_queue.EventQueueService,
        reviewRepo review.ReviewRepo,
+       serviceService *SearchService,
 ) *QuestionService {
        return &QuestionService{
                activityRepo:                     activityRepo,
@@ -143,6 +146,7 @@ func NewQuestionService(
                configService:                    configService,
                eventQueueService:                eventQueueService,
                reviewRepo:                       reviewRepo,
+               searchService:                    serviceService,
        }
 }
 
@@ -1313,7 +1317,35 @@ func (qs *QuestionService) GetQuestionsByTitle(ctx 
context.Context, title string
        if len(title) == 0 {
                return resp, nil
        }
-       questions, err := qs.questionRepo.GetQuestionsByTitle(ctx, title, 10)
+       // check search plugin
+       var finder plugin.Search
+       _ = plugin.CallSearch(func(search plugin.Search) error {
+               finder = search
+               return nil
+       })
+
+       var questions []*entity.Question
+       if finder != nil {
+               // call search plugin if available
+               words := []string{title}
+               res, _, err := finder.SearchQuestions(ctx, 
&plugin.SearchBasicCond{
+                       Words:    words,
+                       Page:     1,
+                       PageSize: 10,
+               })
+               if err != nil {
+                       return resp, err
+               }
+               // get question ids from res
+               questionIDs := make([]string, 0)
+               for _, question := range res {
+                       questionIDs = append(questionIDs, question.ID)
+               }
+               questions, err = qs.questionRepo.FindByID(ctx, questionIDs)
+       } else {
+               questions, err = qs.questionRepo.GetQuestionsByTitle(ctx, 
title, 10)
+       }
+
        if err != nil {
                return resp, err
        }

Reply via email to