Skip to content

Commit

Permalink
Search query string rework (#96)
Browse files Browse the repository at this point in the history
- `search_string` field is removed
- text search vector for `content` and `torrent_contents` is generated in code with improvements in normalisation and tokenisation
- the slow `LIKE` query is removed from text search
- a query DSL is implemented which translates the input search string to a Postgres tsquery
- a CLI command (`reindex`) is provided for updating the tsv for pre-existing records
- the unused `tsv` and `search_string` fields are removed from the `torrents` table

See #89
  • Loading branch information
mgdigital authored Jan 7, 2024
1 parent 5d74cf6 commit 6358b27
Show file tree
Hide file tree
Showing 33 changed files with 1,173 additions and 189 deletions.
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ require (
github.com/joho/godotenv v1.5.1
github.com/mgdigital/gorm-cache/v2 v2.0.0-20230912113927-f2a8dd92a386
github.com/mitchellh/mapstructure v1.5.0
github.com/mozillazg/go-unidecode v0.2.0
github.com/pressly/goose/v3 v3.15.1
github.com/prometheus/client_golang v1.17.0
github.com/redis/go-redis/v9 v9.3.0
github.com/rs/cors v1.10.1
github.com/rs/cors/wrapper/gin v0.0.0-20231013084403-73f81b45a644
github.com/schollz/progressbar/v3 v3.14.1
github.com/stretchr/testify v1.8.4
github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43
github.com/urfave/cli/v2 v2.25.7
Expand Down Expand Up @@ -112,6 +114,7 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mattn/goveralls v0.0.12 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
Expand Down
9 changes: 9 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,7 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
Expand Down Expand Up @@ -450,6 +451,8 @@ github.com/mgdigital/gorm-cache/v2 v2.0.0-20230912113927-f2a8dd92a386 h1:DQflskA
github.com/mgdigital/gorm-cache/v2 v2.0.0-20230912113927-f2a8dd92a386/go.mod h1:JgSdjEKvmt182iLDU4HWIL6qH6Lk3AZIO3tm39KUHYM=
github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc=
github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
Expand All @@ -467,6 +470,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mozillazg/go-unidecode v0.2.0 h1:vFGEzAH9KSwyWmXCOblazEWDh7fOkpmy/Z4ArmamSUc=
github.com/mozillazg/go-unidecode v0.2.0/go.mod h1:zB48+/Z5toiRolOZy9ksLryJ976VIwmDmpQ2quyt1aA=
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
Expand Down Expand Up @@ -562,6 +567,8 @@ github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9c
github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/schollz/progressbar/v3 v3.14.1 h1:VD+MJPCr4s3wdhTc7OEJ/Z3dAeBzJ7yKH/P4lC5yRTI=
github.com/schollz/progressbar/v3 v3.14.1/go.mod h1:Zc9xXneTzWXF81TGoqL71u0sBPjULtEHYtj/WVgVy8E=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
Expand Down Expand Up @@ -857,13 +864,15 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
2 changes: 2 additions & 0 deletions internal/app/appfx/module.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package appfx

import (
"github.com/bitmagnet-io/bitmagnet/internal/app/cmd/reindexcmd"
"github.com/bitmagnet-io/bitmagnet/internal/app/cmd/torrentcmd"
"github.com/bitmagnet-io/bitmagnet/internal/blocking/blockingfx"
"github.com/bitmagnet-io/bitmagnet/internal/boilerplate/app/boilerplateappfx"
Expand Down Expand Up @@ -43,6 +44,7 @@ func New() fx.Option {
versionfx.New(),
// cli commands:
fx.Provide(
reindexcmd.New,
torrentcmd.New,
),
fx.Provide(webui.New),
Expand Down
115 changes: 115 additions & 0 deletions internal/app/cmd/reindexcmd/command.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package reindexcmd

import (
"github.com/bitmagnet-io/bitmagnet/internal/boilerplate/lazy"
"github.com/bitmagnet-io/bitmagnet/internal/database/dao"
"github.com/bitmagnet-io/bitmagnet/internal/database/fts"
"github.com/bitmagnet-io/bitmagnet/internal/model"
"github.com/schollz/progressbar/v3"
"github.com/urfave/cli/v2"
"go.uber.org/fx"
"go.uber.org/zap"
"gorm.io/gen"
"gorm.io/gorm/clause"
)

type Params struct {
fx.In
Dao lazy.Lazy[*dao.Query]
Logger *zap.SugaredLogger
}

type Result struct {
fx.Out
Command *cli.Command `group:"commands"`
}

func New(p Params) (Result, error) {
return Result{Command: &cli.Command{
Name: "reindex",
Usage: "Reindex all records for full text search",
Action: func(ctx *cli.Context) error {
println("reindexing...")
d, err := p.Dao.Get()
if err != nil {
return err
}
contentCount := int64(0)
torrentContentCount := int64(0)
if result, err := d.Content.WithContext(ctx.Context).Count(); err != nil {
return err
} else {
contentCount = result
}
if result, err := d.TorrentContent.WithContext(ctx.Context).Count(); err != nil {
return err
} else {
torrentContentCount = result
}
contentBar := progressbar.Default(contentCount, "[1/2] reindexing content")
batchSize := 1000
tsvs := make(map[model.ContentRef]fts.Tsvector)
var contentResult []*model.Content
if err := d.Content.WithContext(ctx.Context).Preload(
d.Content.Attributes.RelationField,
d.Content.Collections.RelationField,
).FindInBatches(&contentResult, batchSize, func(tx gen.Dao, _ int) error {
for _, c := range contentResult {
c.UpdateTsv()
c.Collections = nil
c.Attributes = nil
tsvs[c.Ref()] = c.Tsv
}
if err := tx.Clauses(
clause.OnConflict{
Columns: []clause.Column{{Name: "type"}, {Name: "source"}, {Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"tsv", "updated_at"}),
},
).CreateInBatches(&contentResult, batchSize); err != nil {
return err
}
_ = contentBar.Add(len(contentResult))
return nil
}); err != nil {
return err
}
_ = contentBar.Finish()
torrentContentBar := progressbar.Default(torrentContentCount, "[2/2] reindexing torrent content")
var torrentContentResult []*model.TorrentContent
if err := d.TorrentContent.WithContext(ctx.Context).Preload(
d.TorrentContent.Torrent.RelationField,
d.TorrentContent.Torrent.Files.RelationField,
).FindInBatches(&torrentContentResult, batchSize, func(tx gen.Dao, _ int) error {
for _, tc := range torrentContentResult {
ref := tc.EntityReference()
if ref.Valid {
tsv, ok := tsvs[ref.Val]
if !ok {
p.Logger.Warnw("missing tsv", "ref", ref.Val)
continue
} else {
tc.Content.Tsv = tsv
}
}
tc.UpdateTsv()
tc.Torrent = model.Torrent{}
tc.Content = model.Content{}
}
if err := tx.Clauses(
clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"tsv", "updated_at"}),
},
).CreateInBatches(torrentContentResult, batchSize); err != nil {
return err
}
_ = torrentContentBar.Add(len(torrentContentResult))
return nil
}); err != nil {
return err
}
_ = torrentContentBar.Finish()
return nil
},
}}, nil
}
107 changes: 25 additions & 82 deletions internal/classifier/video/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@ package video
import (
"context"
"errors"
"fmt"
"github.com/bitmagnet-io/bitmagnet/internal/classifier"
"github.com/bitmagnet-io/bitmagnet/internal/classifier/video/tmdb"
"github.com/bitmagnet-io/bitmagnet/internal/model"
"github.com/bitmagnet-io/bitmagnet/internal/regex"
"strconv"
"strings"
)

type videoResolver struct {
Expand Down Expand Up @@ -37,117 +33,64 @@ func (r videoResolver) Resolve(ctx context.Context, content model.TorrentContent
return model.TorrentContent{}, classifier.ErrNoMatch
}

func (r videoResolver) resolveMovie(ctx context.Context, content model.TorrentContent) (model.TorrentContent, error) {
externalIds := content.ExternalIds.OrderedEntries()
func (r videoResolver) resolveMovie(ctx context.Context, tc model.TorrentContent) (model.TorrentContent, error) {
externalIds := tc.ExternalIds.OrderedEntries()
if len(externalIds) > 0 {
for _, id := range externalIds {
if movie, err := r.tmdbClient.GetMovieByExternalId(ctx, id.Key, id.Value); err == nil {
content.Content = movie
return postEnrich(content), nil
if err := tc.SetContent(movie); err != nil {
return model.TorrentContent{}, err
}
return tc, nil
} else if !errors.Is(err, tmdb.ErrNotFound) {
return model.TorrentContent{}, err
}
}
} else if !content.ReleaseYear.IsNil() {
} else if !tc.ReleaseYear.IsNil() {
if movie, err := r.tmdbClient.SearchMovie(ctx, tmdb.SearchMovieParams{
Title: content.Title,
Year: content.ReleaseYear,
Title: tc.Title,
Year: tc.ReleaseYear,
IncludeAdult: true,
LevenshteinThreshold: 5,
}); err == nil {
content.Content = movie
return postEnrich(content), nil
if err := tc.SetContent(movie); err != nil {
return model.TorrentContent{}, err
}
return tc, nil
} else if !errors.Is(err, tmdb.ErrNotFound) {
return model.TorrentContent{}, err
}
}
return model.TorrentContent{}, classifier.ErrNoMatch
}

func (r videoResolver) resolveTvShow(ctx context.Context, content model.TorrentContent) (model.TorrentContent, error) {
externalIds := content.ExternalIds.OrderedEntries()
func (r videoResolver) resolveTvShow(ctx context.Context, tc model.TorrentContent) (model.TorrentContent, error) {
externalIds := tc.ExternalIds.OrderedEntries()
if len(externalIds) > 0 {
for _, id := range externalIds {
if tvShow, err := r.tmdbClient.GetTvShowByExternalId(ctx, id.Key, id.Value); err == nil {
content.Content = tvShow
return postEnrich(content), nil
if err := tc.SetContent(tvShow); err != nil {
return model.TorrentContent{}, err
}
return tc, nil
} else if !errors.Is(err, tmdb.ErrNotFound) {
return model.TorrentContent{}, err
}
}
} else {
if tvShow, err := r.tmdbClient.SearchTvShow(ctx, tmdb.SearchTvShowParams{
Name: content.Title,
FirstAirDateYear: content.ReleaseYear,
Name: tc.Title,
FirstAirDateYear: tc.ReleaseYear,
IncludeAdult: true,
LevenshteinThreshold: 5,
}); err == nil {
content.Content = tvShow
return postEnrich(content), nil
if err := tc.SetContent(tvShow); err != nil {
return model.TorrentContent{}, err
}
return tc, nil
} else if !errors.Is(err, tmdb.ErrNotFound) {
return model.TorrentContent{}, err
}
}
return model.TorrentContent{}, classifier.ErrNoMatch
}

func postEnrich(tc model.TorrentContent) model.TorrentContent {
c := tc.Content
contentType := c.Type
if c.Adult.Valid && c.Adult.Bool {
contentType = model.ContentTypeXxx
}
tc.ContentType = model.NewNullContentType(contentType)
tc.ContentSource = model.NewNullString(c.Source)
tc.ContentID = model.NewNullString(c.ID)
titleParts := []string{c.Title}
searchStringParts := []string{c.Title}
if c.OriginalTitle.Valid && c.Title != c.OriginalTitle.String {
titleParts = append(titleParts, fmt.Sprintf("/ %s", c.OriginalTitle.String))
searchStringParts = append(searchStringParts, c.OriginalTitle.String)
}
if !c.ReleaseDate.IsNil() {
tc.ReleaseDate = c.ReleaseDate
tc.ReleaseYear = c.ReleaseDate.Year
}
if !tc.ReleaseYear.IsNil() {
titleParts = append(titleParts, fmt.Sprintf("(%d)", tc.ReleaseYear))
searchStringParts = append(searchStringParts, strconv.Itoa(int(tc.ReleaseYear)))
}
if len(tc.Languages) == 0 && c.OriginalLanguage.Valid {
tc.Languages = model.Languages{c.OriginalLanguage.Language: struct{}{}}
}
if len(tc.Episodes) > 0 {
titleParts = append(titleParts, tc.Episodes.String())
}
searchStringParts = append(searchStringParts, additionalSearchStringParts(tc)...)
for _, c := range c.Collections {
if c.Type == "genre" {
searchStringParts = append(searchStringParts, c.Name)
}
}
tc.Title = strings.Join(titleParts, " ")
tc.SearchString = strings.Join(searchStringParts, " ")
return tc
}

func additionalSearchStringParts(content model.TorrentContent) []string {
var searchStringParts []string
if content.VideoResolution.Valid {
searchStringParts = append(searchStringParts, string(content.VideoResolution.VideoResolution))
}
if content.VideoSource.Valid {
searchStringParts = append(searchStringParts, content.VideoSource.VideoSource.String())
}
if content.VideoCodec.Valid {
searchStringParts = append(searchStringParts, string(content.VideoCodec.VideoCodec))
}
if content.VideoModifier.Valid {
searchStringParts = append(searchStringParts, string(content.VideoModifier.VideoModifier))
}
if content.ReleaseGroup.Valid {
searchStringParts = append(searchStringParts, content.ReleaseGroup.String)
}
searchStringParts = append(searchStringParts, regex.NormalizeString(content.Torrent.Name))
return searchStringParts
}
5 changes: 4 additions & 1 deletion internal/classifier/video/tmdb/movie.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package tmdb
import (
"context"
"errors"
"fmt"
"github.com/bitmagnet-io/bitmagnet/internal/database/query"
"github.com/bitmagnet-io/bitmagnet/internal/database/search"
"github.com/bitmagnet-io/bitmagnet/internal/model"
Expand Down Expand Up @@ -35,9 +36,11 @@ func (c *client) SearchMovie(ctx context.Context, p SearchMovieParams) (movie mo
func (c *client) searchMovieLocal(ctx context.Context, p SearchMovieParams) (movie model.Content, err error) {
options := []query.Option{
query.Where(search.ContentTypeCriteria(model.ContentTypeMovie)),
query.QueryString(p.Title),
query.QueryString(fmt.Sprintf("\"%s\"", p.Title)),
query.OrderByQueryStringRank(),
query.Limit(5),
search.ContentDefaultPreload(),
search.ContentDefaultHydrate(),
}
if !p.Year.IsNil() {
options = append(options, query.Where(search.ContentReleaseDateCriteria(model.NewDateRangeFromYear(p.Year))))
Expand Down
Loading

0 comments on commit 6358b27

Please sign in to comment.