From 0232f9cdd2512b96541281d788b80cefa5b2fe21 Mon Sep 17 00:00:00 2001 From: Mmx Date: Sat, 24 Aug 2024 23:29:29 +0800 Subject: [PATCH] feat: allow database fulltext parser --- internal/conf/config.go | 1 + internal/search/db/init.go | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/conf/config.go b/internal/conf/config.go index c5dc9c521bf..6d7d793d214 100644 --- a/internal/conf/config.go +++ b/internal/conf/config.go @@ -18,6 +18,7 @@ type Database struct { TablePrefix string `json:"table_prefix" env:"TABLE_PREFIX"` SSLMode string `json:"ssl_mode" env:"SSL_MODE"` DSN string `json:"dsn" env:"DSN"` + Parser string `json:"parser" env:"PARSER"` } type Meilisearch struct { diff --git a/internal/search/db/init.go b/internal/search/db/init.go index b7d0288f947..6e472ab133d 100644 --- a/internal/search/db/init.go +++ b/internal/search/db/init.go @@ -19,19 +19,26 @@ var config = searcher.Config{ func init() { searcher.RegisterSearcher(config, func() (searcher.Searcher, error) { db := db.GetDb() + var parser string switch conf.Conf.Database.Type { case "mysql": + if conf.Conf.Database.Parser != "" { + parser = fmt.Sprintf(" WITH PARSER %s", conf.Conf.Database.Parser) + } tableName := fmt.Sprintf("%ssearch_nodes", conf.Conf.Database.TablePrefix) - tx := db.Exec(fmt.Sprintf("CREATE FULLTEXT INDEX idx_%s_name_fulltext ON %s(name);", tableName, tableName)) + tx := db.Exec(fmt.Sprintf("CREATE FULLTEXT INDEX idx_%s_name_fulltext%s ON %s(name);", tableName, parser, tableName)) if err := tx.Error; err != nil && !strings.Contains(err.Error(), "Error 1061 (42000)") { // duplicate error log.Errorf("failed to create full text index: %v", err) return nil, err } case "postgres": + if conf.Conf.Database.Parser != "" { + parser = fmt.Sprintf(" gin_%s", conf.Conf.Database.Parser) + } db.Exec("CREATE EXTENSION pg_trgm;") db.Exec("CREATE EXTENSION btree_gin;") tableName := fmt.Sprintf("%ssearch_nodes", conf.Conf.Database.TablePrefix) - tx := db.Exec(fmt.Sprintf("CREATE INDEX idx_%s_name ON %s USING GIN (name);", tableName, tableName)) + tx := db.Exec(fmt.Sprintf("CREATE INDEX idx_%s_name ON %s USING GIN (name%s);", tableName, tableName, parser)) if err := tx.Error; err != nil && !strings.Contains(err.Error(), "SQLSTATE 42P07") { log.Errorf("failed to create index using GIN: %v", err) return nil, err