Browse Source

add tag_full field to search index (#1956)

pull/1961/head
Jason Dove 8 months ago committed by GitHub
parent
commit
17a77694a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 17
      ErsatzTV.Infrastructure/Search/ElasticSearchIndex.cs
  3. 11
      ErsatzTV.Infrastructure/Search/LuceneSearchIndex.cs
  4. 3
      ErsatzTV.Infrastructure/Search/Models/ElasticSearchItem.cs
  5. 1
      ErsatzTV.Infrastructure/Search/SearchQueryParser.cs

2
CHANGELOG.md

@ -19,6 +19,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -19,6 +19,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Possible values will be install-specific and sourced from `vainfo`
- `drm` was the previous default value, and should be used in most cases
- Test all `Vaapi Display` values in `Troubleshooting` > `VAAPI Capabilities`
- Add `tag_full` field to search index
- This field contains the same values as the existing `tag` field, but it is not analyzed or tokenized
### Changed
- **BREAKING CHANGE**: Change channel identifiers used in XMLTV to work around bad behavior in Plex

17
ErsatzTV.Infrastructure/Search/ElasticSearchIndex.cs

@ -47,7 +47,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -47,7 +47,7 @@ public class ElasticSearchIndex : ISearchIndex
return exists.IsValidResponse;
}
public int Version => 44;
public int Version => 45;
public async Task<bool> Initialize(
ILocalFileSystem localFileSystem,
@ -231,6 +231,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -231,6 +231,7 @@ public class ElasticSearchIndex : ISearchIndex
.Text(t => t.Plot, t => t.Store(false))
.Text(t => t.Genre, t => t.Store(false))
.Text(t => t.Tag, t => t.Store(false))
.Keyword(t => t.TagFull, t => t.Store(false))
.Text(t => t.Studio, t => t.Store(false))
.Text(t => t.Actor, t => t.Store(false))
.Text(t => t.Director, t => t.Store(false))
@ -312,6 +313,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -312,6 +313,7 @@ public class ElasticSearchIndex : ISearchIndex
Plot = metadata.Plot ?? string.Empty,
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList(),
Studio = metadata.Studios.Map(s => s.Name).ToList(),
Actor = metadata.Actors.Map(a => a.Name).ToList(),
Director = metadata.Directors.Map(d => d.Name).ToList(),
@ -367,6 +369,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -367,6 +369,7 @@ public class ElasticSearchIndex : ISearchIndex
Plot = metadata.Plot ?? string.Empty,
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList(),
Studio = metadata.Studios.Map(s => s.Name).ToList(),
Actor = metadata.Actors.Map(a => a.Name).ToList(),
TraktList = show.TraktListItems.Map(t => t.TraktList.TraktId.ToString(CultureInfo.InvariantCulture))
@ -431,7 +434,8 @@ public class ElasticSearchIndex : ISearchIndex @@ -431,7 +434,8 @@ public class ElasticSearchIndex : ISearchIndex
AddedDate = GetAddedDate(metadata.DateAdded),
TraktList = season.TraktListItems
.Map(t => t.TraktList.TraktId.ToString(CultureInfo.InvariantCulture)).ToList(),
Tag = metadata.Tags.Map(a => a.Name).ToList()
Tag = metadata.Tags.Map(a => a.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList()
};
foreach ((string key, List<string> value) in GetMetadataGuids(metadata))
@ -524,6 +528,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -524,6 +528,7 @@ public class ElasticSearchIndex : ISearchIndex
Plot = metadata.Plot ?? string.Empty,
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList(),
Studio = metadata.Studios.Map(s => s.Name).ToList()
};
@ -604,6 +609,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -604,6 +609,7 @@ public class ElasticSearchIndex : ISearchIndex
Plot = metadata.Plot ?? string.Empty,
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList(),
Studio = metadata.Studios.Map(s => s.Name).ToList(),
Actor = metadata.Actors.Map(a => a.Name).ToList(),
Director = metadata.Directors.Map(d => d.Name).ToList(),
@ -667,6 +673,7 @@ public class ElasticSearchIndex : ISearchIndex @@ -667,6 +673,7 @@ public class ElasticSearchIndex : ISearchIndex
Plot = metadata.Plot ?? string.Empty,
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList(),
Studio = metadata.Studios.Map(s => s.Name).ToList(),
Actor = metadata.Actors.Map(a => a.Name).ToList(),
Director = metadata.Directors.Map(d => d.Name).ToList(),
@ -717,7 +724,8 @@ public class ElasticSearchIndex : ISearchIndex @@ -717,7 +724,8 @@ public class ElasticSearchIndex : ISearchIndex
Artist = metadata.Artists.ToList(),
AlbumArtist = metadata.AlbumArtists.ToList(),
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList()
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList()
};
AddStatistics(doc, song.MediaVersions);
@ -761,7 +769,8 @@ public class ElasticSearchIndex : ISearchIndex @@ -761,7 +769,8 @@ public class ElasticSearchIndex : ISearchIndex
SubLanguageTag = GetSubLanguageTags(image.MediaVersions),
AddedDate = GetAddedDate(metadata.DateAdded),
Genre = metadata.Genres.Map(g => g.Name).ToList(),
Tag = metadata.Tags.Map(t => t.Name).ToList()
Tag = metadata.Tags.Map(t => t.Name).ToList(),
TagFull = metadata.Tags.Map(t => t.Name).ToList()
};
IEnumerable<int> libraryFolderIds = image.MediaVersions

11
ErsatzTV.Infrastructure/Search/LuceneSearchIndex.cs

@ -34,6 +34,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -34,6 +34,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
internal const string SortTitleField = "sort_title";
internal const string GenreField = "genre";
internal const string TagField = "tag";
internal const string TagFullField = "tag_full";
internal const string PlotField = "plot";
internal const string LibraryNameField = "library_name";
internal const string LibraryIdField = "library_id";
@ -110,7 +111,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -110,7 +111,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
return Task.FromResult(directoryExists && fileExists);
}
public int Version => 44;
public int Version => 45;
public async Task<bool> Initialize(
ILocalFileSystem localFileSystem,
@ -462,6 +463,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -462,6 +463,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Studio studio in metadata.Studios)
@ -649,6 +651,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -649,6 +651,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Studio studio in metadata.Studios)
@ -784,6 +787,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -784,6 +787,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
AddMetadataGuids(metadata, doc);
@ -928,6 +932,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -928,6 +932,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Studio studio in metadata.Studios)
@ -1076,6 +1081,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -1076,6 +1081,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Studio studio in metadata.Studios)
@ -1186,6 +1192,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -1186,6 +1192,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Studio studio in metadata.Studios)
@ -1274,6 +1281,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -1274,6 +1281,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Genre genre in metadata.Genres)
@ -1345,6 +1353,7 @@ public sealed class LuceneSearchIndex : ISearchIndex @@ -1345,6 +1353,7 @@ public sealed class LuceneSearchIndex : ISearchIndex
foreach (Tag tag in metadata.Tags)
{
doc.Add(new TextField(TagField, tag.Name, Field.Store.NO));
doc.Add(new StringField(TagFullField, tag.Name, Field.Store.NO));
}
foreach (Genre genre in metadata.Genres)

3
ErsatzTV.Infrastructure/Search/Models/ElasticSearchItem.cs

@ -82,6 +82,9 @@ public class ElasticSearchItem : MinimalElasticSearchItem @@ -82,6 +82,9 @@ public class ElasticSearchItem : MinimalElasticSearchItem
[JsonPropertyName(LuceneSearchIndex.TagField)]
public List<string> Tag { get; set; }
[JsonPropertyName(LuceneSearchIndex.TagFullField)]
public List<string> TagFull { get; set; }
[JsonPropertyName(LuceneSearchIndex.StudioField)]
public List<string> Studio { get; set; }

1
ErsatzTV.Infrastructure/Search/SearchQueryParser.cs

@ -35,6 +35,7 @@ public static class SearchQueryParser @@ -35,6 +35,7 @@ public static class SearchQueryParser
{ LuceneSearchIndex.LibraryFolderIdField, keywordAnalyzer },
{ LuceneSearchIndex.VideoCodecField, keywordAnalyzer },
{ LuceneSearchIndex.VideoDynamicRange, keywordAnalyzer },
{ LuceneSearchIndex.TagFullField, keywordAnalyzer },
{ LuceneSearchIndex.PlotField, new StandardAnalyzer(LuceneSearchIndex.AppLuceneVersion) }
};

Loading…
Cancel
Save