My intuition says it's not possible to get 1 without destroying the ability to get 2, or vice versa. But I'm no expert. The solution that leaps to my mind is to use a locality-sensitive hash function. It would make search stochastic, which means reversing the encoding would be easier. Seems like any hash-based solution will involve a tradeoff between 1 and 2.
What did you have in mind?