Вставлю свои 5 копеек, так как в настоящий момент примерно над этим сейчас и работаю. Моё решение следующее:
Хранить этот фильтр в виде формализованного набора правил для построения запроса. Что то вроде
[
'OR'
['like', 'from', '%example%'],
['=', 'theme', 'hello'],
['like', 'body', 'world']
]
Затем "скармливаю" этот массив в объект ConditionDispatcher, который в зависимости от типа указанного в нём "провайдера" (потребителя) преобразует этот набор правил либо в where-секцию MySQL запроса, либо в запрос в MongoDb, либо в код функции, выполняющей фильтрацию на стороне браузера (javascript).