On Jun 7, 2006, at 3:43 PM, Chris Hostetter wrote:
Getting the inverse of a DocSet is currently not a built in operation, you have to use the getBits() method and operate on it, something like this
should work...

  DocSet definedSet = search.getDocSet(parseQuery("field:[* TO *]"));
DocSet unDefinedSet = new BitDocSet(fieldDefinedSet.getBits().flip (0,search.maxDoc()))
  int count = unDefinedSet.intersectionCount(results.docSet)

...at least, i think it should work .. i've never really had to worry
about inverted sets.

Here's how I build "inverse" BitSets that represent documents that do not have a value in a facet field:

      BitSet catchall = new BitSet(reader.numDocs());

      TermEnum termEnum = reader.terms(new Term(field, ""));
      while (true) {
        Term term = termEnum.term();
        if (term == null || !term.field().equals(field)) break;

        termDocs.seek(term);
        BitSet bitSet = new BitSet(reader.numDocs());
        while (termDocs.next()) {
          bitSet.set(termDocs.doc());
        }

        catchall.or(bitSet);

        // ... cache bitSet ...

        if (! termEnum.next()) break;
      }

      // ... cache catchall ...

Solr's DocSets are a better way to go in the long run, I'm convinced - I'm just now starting to leverage them in other ways. I do still need to do these kinds of inverted sets somehow.

        Erik

Reply via email to