Language buries the same idea under many surface forms, and the earliest text systems could not see past that.
A keyword index that stores running will not match a query for run unless something normalises them.
Stemming is the crude answer: strip suffixes according to a list of rules.
The Porter stemmer is the classic, a fixed cascade of rules applied to English endings.
It is fast, needs no dictionary, and often returns something that is not a word at all.
Studies becomes studi, and both connect and connection collapse to connect, which is usually what you wanted.
The failures come in pairs: over-stemming merges unrelated words, under-stemming misses related ones.
Universal and university both stem to univers, which is over-stemming doing real damage.
Lemmatization does the job properly by looking the word up and returning its dictionary form.
That requires knowing the part of speech, since meeting as a noun and as a verb lemmatise differently.
It is slower and needs language resources, but the output is always a real word.
Either step shrinks the vocabulary, which used to matter enormously for bag of words and TF-IDF.
A smaller vocabulary meant smaller, denser matrices and better matching on sparse data.
Subword tokenization changed the calculus, since run and running already share their first piece.
So these techniques now live mostly in classical search stacks rather than in anything built on transformers.