Saving search history with many checks and validations inside
It seems dirty and unobvious. 


I wouldn't go that far. I think that the code generally looks fine.

Style

The indentation and spacing is generally fine, but sometimes it is inconsistent (2 vs 4 spaces, spaces around +).

validate

I would validate right in the constructor instead of in a public method, because someone might forget to call the method, and then you end up with an invalid object. 

And as validate has side-effects (it doesn't just check the string, it actually changes it), I would add a JavaDoc comment.

removeSameWord

Is this method really needed? Your database schema should be able to use a unique constraint to not allow duplicate rows. Or, since you are using merge, you should also be able to just remove it completely, since merge updates existing entries.

Naming


Sometimes, you use word or words and sometimes searchString for what seems to me to be the same thing. This is a bit confusing, you should use variable names consistently.
the query removeOldWords could just be removeByIds, because it doesn't care if words are old or new, it just deletes all words with the given ids.
checkWordsSizeLimit doesn't just check, it also deletes, the name should reflect this (maybe something like enforceWordsSizeLimit; or split the method up in getLastIds and removeByIds).
the query removeSameWord could be renamed to remove (the query doesn't really care if it's the same word as some other word, it just removes the given entry).
removeSameWord could also be remove (the parameters make it clear what will be removed) or removeExisting.