Analysis overview
Use this section when turning application text into searchable terms. Start with analysers, then choose tokenisers and filters only when the default pipeline does not fit.
Analysis turns raw text into the terms LeanCorpus stores and queries. Use the same pipeline at index-time and query-time so terms line up.
The parts
| Component | Role | Starting point |
|---|---|---|
IAnalyser |
End-to-end pipeline | StandardAnalyser, StemmedAnalyser, LanguageAnalyser, IcuAnalyser |
ITokeniser |
Splits input into tokens | Tokeniser, Uax29UrlEmailTokeniser, IcuTokeniser |
ITokenFilter |
Rewrites or drops tokens | LowercaseFilter, StopWordFilter, SynonymGraphFilter |
ICharFilter |
Rewrites input text before tokenisation | HtmlStripCharFilter, MappingCharFilter, PatternReplaceCharFilter |
IStemmer |
Reduces tokens to root forms | EnglishStemmer, FrenchStemmer, GermanStemmer |
What to start with
StandardAnalyserfor general text with lowercase and stop-word removal.StemmedAnalyserfor English text where broader recall matters.AnalyserFactory.Create("en")(or another language code) for a built-in language pipeline.IcuAnalyserorIcuTokeniserwhen Unicode segmentation matters.Analyserdirectly for a custom tokeniser and filter chain.
English stemming choices
| Type | Behaviour | When |
|---|---|---|
EnglishStemmer |
Porter-based | Default for English. Used by AnalyserFactory.Create("en"). |
LightEnglishStemmer |
Lighter suffix stripping | When Porter is too aggressive. |
KStemmer |
Lexicon-validated (Krovetz-inspired) | When false stems cost more than missed stems. Needs KStemLexicon.FromFile. |
StemmedAnalyser also uses Porter stemming.
Custom pipeline
using Rowles.LeanCorpus.Analysis;
using Rowles.LeanCorpus.Analysis.Filters;
using Rowles.LeanCorpus.Analysis.Tokenisers;
var analyser = new Analyser(
tokeniser: new Uax29UrlEmailTokeniser(),
new LowercaseFilter(),
new StopWordFilter(StopWords.English),
new SynonymGraphFilter(new SynonymMap(new Dictionary<string, string[]>
{
["tv"] = ["television"]
})));