I need to make a email field searchable. Let us say I have email in one of the records of the search index - praagarwal@microsoft.com
I should be able to search for this via -
- mytestemailid
- mytestemailid@domain.com
- mytestemailid@domain.com and if possible via mytes, myteste, etc.
Which built-in analyzer I should use, or how to configure a custom analyzer for this requirement?
I tried to achieve this via a edge N gram tokenizer.
[SearchableField(SearchAnalyzerName = LexicalAnalyzerName.Values.StandardLucene, IndexAnalyzerName = "prefixEdgeAnalyzer")]
public string? LastUpdatedBy { get; set; }
This is how I created the analyzer
var nedgeTokenfilter = new EdgeNGramTokenFilter("edgeNgramTokenFilterV2");
nedgeTokenfilter.MinGram = 3;
nedgeTokenfilter.MaxGram = 20;
nedgeTokenfilter.Side = EdgeNGramTokenFilterSide.Front;
var prefixEdgeAnalyzer = new CustomAnalyzer("prefixEdgeAnalyzer", LexicalTokenizerName.Whitespace);
prefixEdgeAnalyzer.TokenFilters.Add(TokenFilterName.Lowercase);
prefixEdgeAnalyzer.TokenFilters.Add("edgeNgramTokenFilterV2");
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(SearchRequest));
var definition = new SearchIndex(indexName, searchFields);
definition.TokenFilters.Add(nedgeTokenfilter);
definition.Analyzers.Add(prefixEdgeAnalyzer);
var response = await _adminClient.CreateOrUpdateIndexAsync(definition).ConfigureAwait(false);
Search via mytestemailid worked but search via complete email mytestemailid@domain.com did not work.