If the files were large, and any lag in the search became perceptible, it might be because the use of union entails performing two searches, and then combining them. The use of except then involves a third search and the computation of an intersection with the existing results.
Should performance become an issue (unlikely, I think) you could experiment with single search alternatives to union and except, perhaps starting with something like:
and the approach you are taking is generally a good one – it makes sense to start by thinking in terms of 2 or 3 very simple searches, combined by the set level operators.
Most of the time that will give more than enough performance (Jesse is the master of fast JS apps), and if you do want to fine-tune or time-compress for working with larger files later on, you can generally fuse the set operations on several searches down to corresponding Boolean operations on the clauses of a single search.
The mappings for such translations are, of course, these: