diff --git a/ErsatzTV.Infrastructure/Search/SearchIndex.cs b/ErsatzTV.Infrastructure/Search/SearchIndex.cs index 97659f170..297bba07d 100644 --- a/ErsatzTV.Infrastructure/Search/SearchIndex.cs +++ b/ErsatzTV.Infrastructure/Search/SearchIndex.cs @@ -11,6 +11,9 @@ using ErsatzTV.Core.Interfaces.Search; using ErsatzTV.Core.Search; using LanguageExt; using LanguageExt.UnsafeValueAccess; +using Lucene.Net.Analysis; +using Lucene.Net.Analysis.Core; +using Lucene.Net.Analysis.Miscellaneous; using Lucene.Net.Analysis.Standard; using Lucene.Net.Documents; using Lucene.Net.Index; @@ -62,7 +65,7 @@ namespace ErsatzTV.Infrastructure.Search _cultureInfos = CultureInfo.GetCultures(CultureTypes.NeutralCultures).ToList(); } - public int Version => 7; + public int Version => 8; public Task Initialize(ILocalFileSystem localFileSystem) { @@ -155,9 +158,14 @@ namespace ErsatzTV.Infrastructure.Search var searcher = new IndexSearcher(reader); int hitsLimit = limit == 0 ? searcher.IndexReader.MaxDoc : skip + limit; using var analyzer = new StandardAnalyzer(AppLuceneVersion); + var customAnalyzers = new Dictionary + { + { LibraryNameField, new KeywordAnalyzer() } + }; + using var analyzerWrapper = new PerFieldAnalyzerWrapper(analyzer, customAnalyzers); QueryParser parser = !string.IsNullOrWhiteSpace(searchField) - ? new QueryParser(AppLuceneVersion, searchField, analyzer) - : new MultiFieldQueryParser(AppLuceneVersion, new[] { TitleField }, analyzer); + ? new QueryParser(AppLuceneVersion, searchField, analyzerWrapper) + : new MultiFieldQueryParser(AppLuceneVersion, new[] { TitleField }, analyzerWrapper); parser.AllowLeadingWildcard = true; Query query = ParseQuery(searchQuery, parser); var filter = new DuplicateFilter(TitleAndYearField); @@ -251,7 +259,7 @@ namespace ErsatzTV.Infrastructure.Search new StringField(TypeField, MovieType, Field.Store.NO), new TextField(TitleField, metadata.Title, Field.Store.NO), new StringField(SortTitleField, metadata.SortTitle.ToLowerInvariant(), Field.Store.NO), - new TextField(LibraryNameField, movie.LibraryPath.Library.Name, Field.Store.NO), + new StringField(LibraryNameField, movie.LibraryPath.Library.Name, Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) }; @@ -338,7 +346,7 @@ namespace ErsatzTV.Infrastructure.Search new StringField(TypeField, ShowType, Field.Store.NO), new TextField(TitleField, metadata.Title, Field.Store.NO), new StringField(SortTitleField, metadata.SortTitle.ToLowerInvariant(), Field.Store.NO), - new TextField(LibraryNameField, show.LibraryPath.Library.Name, Field.Store.NO), + new StringField(LibraryNameField, show.LibraryPath.Library.Name, Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) }; @@ -418,7 +426,7 @@ namespace ErsatzTV.Infrastructure.Search new StringField(TypeField, ArtistType, Field.Store.NO), new TextField(TitleField, metadata.Title, Field.Store.NO), new StringField(SortTitleField, metadata.SortTitle.ToLowerInvariant(), Field.Store.NO), - new TextField(LibraryNameField, artist.LibraryPath.Library.Name, Field.Store.NO), + new StringField(LibraryNameField, artist.LibraryPath.Library.Name, Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) }; @@ -479,7 +487,7 @@ namespace ErsatzTV.Infrastructure.Search new StringField(TypeField, MusicVideoType, Field.Store.NO), new TextField(TitleField, metadata.Title, Field.Store.NO), new StringField(SortTitleField, metadata.SortTitle.ToLowerInvariant(), Field.Store.NO), - new TextField(LibraryNameField, musicVideo.LibraryPath.Library.Name, Field.Store.NO), + new StringField(LibraryNameField, musicVideo.LibraryPath.Library.Name, Field.Store.NO), new StringField(TitleAndYearField, GetTitleAndYear(metadata), Field.Store.NO), new StringField(JumpLetterField, GetJumpLetter(metadata), Field.Store.YES) }; @@ -543,7 +551,7 @@ namespace ErsatzTV.Infrastructure.Search } private static string GetTitleAndYear(Metadata metadata) => - $"{metadata.Title}_{metadata.Year}"; + $"{metadata.Title}_{metadata.Year}".ToLowerInvariant(); private static string GetJumpLetter(Metadata metadata) { diff --git a/ErsatzTV/Pages/Libraries.razor b/ErsatzTV/Pages/Libraries.razor index 1a23985a6..02c070153 100644 --- a/ErsatzTV/Pages/Libraries.razor +++ b/ErsatzTV/Pages/Libraries.razor @@ -22,7 +22,7 @@ - + Library Kind @@ -60,6 +60,11 @@ } + + + + @if (context is LocalLibraryViewModel) {