public override bool IncrementToken()
        {
            if (!input.IncrementToken())
            {
                return(false);
            }

            ITermAttribute   termAttribute   = this.GetAttribute <ITermAttribute>();
            ISourceAttribute sourceAttribute = GetAttribute <ISourceAttribute>();
            ISpellAttribute  spellAttribute  = GetAttribute <ISpellAttribute>();
            IStemAttribute   stemAttribute   = GetAttribute <IStemAttribute>();

            sourceAttribute.Term = termAttribute.Term;
            spellAttribute.Term  = termAttribute.Term;
            stemAttribute.Term   = termAttribute.Term;

            if (!SpellChecker.Exist(spellAttribute.Term))
            {
                var res = SpellChecker.SuggestSimilar(spellAttribute.Term, 100);
                if (res.Length != 0)
                {
                    spellAttribute.Term = res[0];
                }
            }

            termAttribute.SetTermBuffer(spellAttribute.Term);

            return(true);
        }
        public override bool IncrementToken()
        {
            if (!input.IncrementToken())
            {
                return(false);
            }

            ITermAttribute  termAttribute  = GetAttribute <ITermAttribute>();
            ISpellAttribute spellAttribute = GetAttribute <ISpellAttribute>();
            IStemAttribute  stemAttribute  = GetAttribute <IStemAttribute>();

            var term = termAttribute.Term;
            var stem = _stemmer.Stem(term);

            stemAttribute.Term = stem;

            SpellChecker.setStringDistance(_customDistance);

            if (!SpellChecker.Exist(term))
            {
                var similarWords = SpellChecker.SuggestSimilar(term, NumberOfSuggestions);
                if (similarWords.Length != 0)
                {
                    spellAttribute.Term = similarWords[0];
                    return(true);
                }
            }
            else
            {
                spellAttribute.Term = term;
                return(true);
            }

            SpellChecker.setStringDistance(_defaultDistance);

            if (!SpellChecker.Exist(stem))
            {
                var similarWords = SpellChecker.SuggestSimilar(stem, NumberOfSuggestions);
                if (similarWords.Length != 0)
                {
                    spellAttribute.Term = similarWords[0];
                    return(true);
                }
            }

            spellAttribute.Term = stem;
            return(true);
        }