I suspect that 3 is actually better. You can use CachingWrapperFilter to cache the filters automatically. Also, I found that filters were much faster to construct than I first thought.
That said, though, why bother with a filter? Why not just make the list part of the query and let Lucene take care of it for you? So each query would have a clause 'And list-id = <specific list here>). There was a discussion last week about Lucene's attempts to restrict queries by the most-restrictive clause first, so it seems to me that this is all done for you without filters. I'd only think about filters *after* I had some performance numbers..... Philosophically (don't you hate that word) I'm reluctant to get any more complicated than I have to before I have some performance numbers indicating that complexity is required... Best Erick