Searching documents at scale: how to maintain cleaned documents?
Think of this problem as a pipeline of steps to automate and re-run, and not just the ML step at the end:


Read in raw documents.
Stem words, remove stop words.
Perform TF-IDF
Train model on cleaned up data.


Now when it comes time to score:


Load your saved model.
Repeat steps #2 and #3 from above.
Send the cleaned data into your model for a prediction/recommendation.


Here is an example in Python of something like that:

http://scikit-learn.org/stable/auto_examples/model_selection/grid_search_text_feature_extraction.html