package dao import ( "github.com/meilisearch/meilisearch-go" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/pkg/zinc" "github.com/sirupsen/logrus" ) var ( _ core.TweetSearchService = (*zincTweetSearchServant)(nil) _ core.TweetSearchService = (*bridgeTweetSearchServant)(nil) ) type documents struct { primaryKey []string docItems core.DocItems identifiers []string } type bridgeTweetSearchServant struct { ts core.TweetSearchService updateDocsCh chan *documents } type zincTweetSearchServant struct { indexName string client *zinc.ZincClient } type meiliTweetSearchServant struct { client *meilisearch.Client index *meilisearch.Index } func NewTweetSearchService() core.TweetSearchService { bts := &bridgeTweetSearchServant{} capacity := conf.TweetSearchSetting.MaxUpdateQPS if capacity < 10 { capacity = 10 } else if capacity > 10000 { capacity = 10000 } bts.updateDocsCh = make(chan *documents, capacity) if conf.CfgIf("Zinc") { bts.ts = newZincTweetSearchServant() } else if conf.CfgIf("Meili") { bts.ts = newMeiliTweetSearchServant() } else { // default use Zinc as tweet search service bts.ts = newZincTweetSearchServant() } logrus.Infof("use %s as tweet search serice by version %s", bts.ts.Name(), bts.ts.Version()) numWorker := conf.TweetSearchSetting.MinWorker if numWorker < 5 { numWorker = 5 } else if numWorker > 1000 { numWorker = 1000 } logrus.Debugf("use %d backend worker to update documents to search engine", numWorker) // 启动文档更新器 for ; numWorker > 0; numWorker-- { go bts.startUpdateDocs() } return bts }