A major problem is a lack of indexes in array elements, which then forces you to build an otherwise unneeded table.
That being said, it's definitely doable, to some extent.
A major problem is a lack of indexes in array elements, which then forces you to build an otherwise unneeded table.
That being said, it's definitely doable, to some extent.
http://www.postgresql.org/docs/9.1/static/intarray.html#AEN1...
And it happens to use bloom filters under-the-hood to do it.
From the docs:
"Two GiST index operator classes are provided: gist__int_ops (used by default) is suitable for small- to medium-size data sets, while gist__intbig_ops uses a larger signature and is more suitable for indexing large data sets (i.e., columns containing a large number of distinct array values). The implementation uses an RD-tree data structure with built-in lossy compression."
That bit about the lossy compression in the implementation if referencing the use of a bloom filter. Also mentioned here, http://archives.postgresql.org/pgsql-hackers/2005-05/msg0147...
That being said, if you stored your bitvector as an array of powers of two, then it would work. But that would be horribly inefficient in terms of space usage.
In your case, though, a strict immutable function mapping the bitvector to an int array as part of a functional index should be sufficient to use the existing contrib module: you don't need to store the things you index in the table.