@@ -24,6 +24,8 @@ internal class AzureSearchIndex : ISearchIndex
2424
2525 private const string EdgeNGramTokenFilter = "EdgeNGramTokenFilter" ;
2626
27+ private const string DotReplacementCharFilter = "DotReplacementCharFilter" ;
28+
2729 private static readonly string [ ] CorsAllowedHosts = { "*" } ;
2830
2931 private readonly SearchIndexClient _client ;
@@ -39,11 +41,12 @@ public async Task CreateIndexIfRequiredAsync(CancellationToken cancellationToken
3941 {
4042 var index = new SearchIndex ( _indexName ) ;
4143 index . Fields = BuildFields ( ) ;
42- index . Analyzers . Add ( BuildAnalyzer ( StandardAnalyzer , LexicalTokenizerName . Standard , TokenFilterName . Lowercase ) ) ;
43- index . Analyzers . Add ( BuildAnalyzer ( PrefixAnalyzer , LexicalTokenizerName . Standard , TokenFilterName . Lowercase , EdgeNGramTokenFilter ) ) ;
44- index . Analyzers . Add ( BuildAnalyzer ( SuffixAnalyzer , LexicalTokenizerName . Standard , TokenFilterName . Lowercase , TokenFilterName . Reverse , EdgeNGramTokenFilter ) ) ;
45- index . Analyzers . Add ( BuildAnalyzer ( ReverseAnalyzer , LexicalTokenizerName . Standard , TokenFilterName . Lowercase , TokenFilterName . Reverse ) ) ;
46- index . Analyzers . Add ( BuildAnalyzer ( UrlAnalyzer , LexicalTokenizerName . UaxUrlEmail , TokenFilterName . Lowercase ) ) ;
44+ index . Analyzers . Add ( BuildAnalyzer ( StandardAnalyzer , LexicalTokenizerName . Standard , null , TokenFilterName . Lowercase ) ) ;
45+ index . Analyzers . Add ( BuildAnalyzer ( PrefixAnalyzer , LexicalTokenizerName . Standard , DotReplacementCharFilter , TokenFilterName . Lowercase , EdgeNGramTokenFilter ) ) ;
46+ index . Analyzers . Add ( BuildAnalyzer ( SuffixAnalyzer , LexicalTokenizerName . Standard , DotReplacementCharFilter , TokenFilterName . Lowercase , TokenFilterName . Reverse , EdgeNGramTokenFilter ) ) ;
47+ index . Analyzers . Add ( BuildAnalyzer ( ReverseAnalyzer , LexicalTokenizerName . Standard , DotReplacementCharFilter , TokenFilterName . Lowercase , TokenFilterName . Reverse ) ) ;
48+ index . Analyzers . Add ( BuildAnalyzer ( UrlAnalyzer , LexicalTokenizerName . UaxUrlEmail , null , TokenFilterName . Lowercase ) ) ;
49+ index . CharFilters . Add ( BuildCharFilter ( ) ) ;
4750 index . TokenFilters . Add ( BuildTokenFilter ( ) ) ;
4851 index . ScoringProfiles . Add ( BuildScoringProfile ( ) ) ;
4952 index . DefaultScoringProfile = ScoringProfile ;
@@ -57,14 +60,25 @@ private IList<SearchField> BuildFields()
5760 return new FieldBuilder ( ) . Build ( typeof ( ManifestInfo ) ) ;
5861 }
5962
60- private CustomAnalyzer BuildAnalyzer ( string name , LexicalTokenizerName tokenizer , params TokenFilterName [ ] filters )
63+ private CustomAnalyzer BuildAnalyzer ( string name , LexicalTokenizerName tokenizer , string ? charFilter , params TokenFilterName [ ] filters )
6164 {
6265 var analyzer = new CustomAnalyzer ( name , tokenizer ) ;
66+
67+ if ( charFilter != null )
68+ {
69+ analyzer . CharFilters . Add ( charFilter ) ;
70+ }
71+
6372 filters . ForEach ( _ => analyzer . TokenFilters . Add ( _ ) ) ;
6473
6574 return analyzer ;
6675 }
6776
77+ private CharFilter BuildCharFilter ( )
78+ {
79+ return new PatternReplaceCharFilter ( DotReplacementCharFilter , "\\ ." , " " ) ;
80+ }
81+
6882 private TokenFilter BuildTokenFilter ( )
6983 {
7084 return new EdgeNGramTokenFilter ( EdgeNGramTokenFilter )
0 commit comments