Интересно как этот intersect будет работать с множествами c сотнями тысяч записей. Формально, конечно, побыстрее чем join записей.
Если твоя система умная, то она такие лексемы сначала проигнорирует, а потом подумает, что быстрее - каждый документ просмотреть или же все-таки пересечение с очень большим списком делать (или вообще нафиг ее выбросить).
Но мне хочется отказаться от пересечений в принципе.
Тогда смотри в сторону GiST - это так называемые "signature files"-алгоритмы. Для каждого документа считается битовая маска определенной длины. Такая же маска считается для запроса. Дальше - бинарные операции с последующим просмотром каждого документа для фильтрации false positived.
В общем случае быстродействие этих алгоритмов хуже чем для inverted files (твой вариант), но читай также инфо от PgSQL - они утверждают, что GiST лучше для часто-обновляемых баз.
Роман

