Browse Source

another wildcard search fix (#1667)

pull/1668/head
Jason Dove 2 years ago committed by GitHub
parent
commit
2e2523c380
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 25
      ErsatzTV.Infrastructure/Search/CustomMultiFieldQueryParser.cs
  3. 6
      ErsatzTV.Infrastructure/Search/SearchQueryParser.cs

1
CHANGELOG.md

@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed
- Fix some cases of 404s from Plex when files were replaced and scanning the library from ETV didn't help
- Fix more wildcard search phrase queries (when wildcards are used in quotes, like `title:"law & order*"`)
## [0.8.6-beta] - 2024-04-03
### Added

25
ErsatzTV.Infrastructure/Search/CustomMultiFieldQueryParser.cs

@ -3,6 +3,7 @@ using ErsatzTV.Core; @@ -3,6 +3,7 @@ using ErsatzTV.Core;
using Lucene.Net.Analysis;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers.Classic;
using Lucene.Net.QueryParsers.ComplexPhrase;
using Lucene.Net.Search;
using Lucene.Net.Util;
using Query = Lucene.Net.Search.Query;
@ -11,8 +12,11 @@ namespace ErsatzTV.Infrastructure.Search; @@ -11,8 +12,11 @@ namespace ErsatzTV.Infrastructure.Search;
public class CustomMultiFieldQueryParser : MultiFieldQueryParser
{
private static readonly List<string> NumericFields = new()
{
private readonly LuceneVersion _matchVersion;
private readonly Analyzer _analyzer;
private static readonly List<string> NumericFields =
[
LuceneSearchIndex.MinutesField,
LuceneSearchIndex.SecondsField,
LuceneSearchIndex.HeightField,
@ -20,7 +24,7 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser @@ -20,7 +24,7 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser
LuceneSearchIndex.SeasonNumberField,
LuceneSearchIndex.EpisodeNumberField,
LuceneSearchIndex.VideoBitDepthField
};
];
public CustomMultiFieldQueryParser(
LuceneVersion matchVersion,
@ -28,6 +32,8 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser @@ -28,6 +32,8 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser
Analyzer analyzer,
IDictionary<string, float> boosts) : base(matchVersion, fields, analyzer, boosts)
{
_matchVersion = matchVersion;
_analyzer = analyzer;
}
public CustomMultiFieldQueryParser(LuceneVersion matchVersion, string[] fields, Analyzer analyzer) : base(
@ -35,6 +41,8 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser @@ -35,6 +41,8 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser
fields,
analyzer)
{
_matchVersion = matchVersion;
_analyzer = analyzer;
}
protected override Query GetFieldQuery(string field, string queryText, bool quoted)
@ -90,7 +98,16 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser @@ -90,7 +98,16 @@ public class CustomMultiFieldQueryParser : MultiFieldQueryParser
// assume asterisk always means wildcard
if (queryText.Contains('*'))
{
return GetWildcardQuery(field, queryText);
var parser = new ComplexPhraseQueryParser(_matchVersion, LuceneSearchIndex.TitleField, _analyzer)
{
AllowLeadingWildcard = true
};
string queryToParse = string.IsNullOrWhiteSpace(field)
? $"\"{queryText}\""
: $"{field}:\"{queryText}\"";
return parser.Parse(queryToParse);
}
return base.GetFieldQuery(field, queryText, slop);

6
ErsatzTV.Infrastructure/Search/SearchQueryParser.cs

@ -3,12 +3,18 @@ using Lucene.Net.Analysis.Core; @@ -3,12 +3,18 @@ using Lucene.Net.Analysis.Core;
using Lucene.Net.Analysis.Miscellaneous;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.QueryParsers.Classic;
using Lucene.Net.Search;
using Query = Lucene.Net.Search.Query;
namespace ErsatzTV.Infrastructure.Search;
public static class SearchQueryParser
{
static SearchQueryParser()
{
BooleanQuery.MaxClauseCount = 1024 * 4;
}
internal static Analyzer AnalyzerWrapper()
{
using var defaultAnalyzer = new CustomAnalyzer(LuceneSearchIndex.AppLuceneVersion);

Loading…
Cancel
Save