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 }
