Re-implement NGramAnalyzer as an enhancement to any existing analyzer

Use "keyword" analyzer for previous behavior (which would preserve
spaces, etc) but ngram'ing the output of another analyzer is more
useful in practice (it'll drop whitespace, punctuation, common words,
etc).