2016-12-03 4 views
2

org.apache.lucene.search.Queryを特定のorg.apache.lucene.util.Bitsオブジェクトに適用するにはどうすればよいですか?ビットでLuceneクエリを適用する

背景:私はorg.apache.lucene.index.FilterLeafReaderのサブクラスを持っています。ここでは、 "ビット"でクエリを適用して、livedocsをフィルタリングします。

javadocによると、私がgetLiveDocs()を上書きする場合は、numDocs()を上書きする必要があります。そこで問題は、(Luceneのメーリングリストに質問をした後に)私は、このソリューションになってしまった

答えて

1

FilterLeafReader以内)クエリに基づいてドキュメントの数をフィルタリングする方法にも拡張しています

final IndexSearcher searcher = new IndexSearcher(reader); 
searcher.setQueryCache(null); 
final boolean needsScores = false; // scores are not needed, only matching docs 
final Weight preserveWeight = searcher.createNormalizedWeight(preserveFilter, needsScores); 
final int maxDoc = in.maxDoc(); 
final FixedBitSet bits = new FixedBitSet(maxDoc); 
// ignore livedocs here, as we filter them later: 
final Scorer preverveScorer = preserveWeight.scorer(context); 
if (preverveScorer != null) { 
    bits.or(preverveScorer.iterator()); 
} 
if (negateFilter) { 
    bits.flip(0, maxDoc); 
} 

if (in.hasDeletions()) { 
    final Bits oldLiveDocs = in.getLiveDocs(); 
    assert oldLiveDocs != null; 
    final DocIdSetIterator it = new BitSetIterator(bits, 0L); // the cost is not useful here 
    for (int i = it.nextDoc(); i != DocIdSetIterator.NO_MORE_DOCS; i = it.nextDoc()) { 
    if (!oldLiveDocs.get(i)) { 
     // we can safely modify the current bit, as the iterator already stepped over it: 
     bits.clear(i); 
    } 
} 
} 

this.liveDocs = bits; 
this.numDocs = bits.cardinality(); 

https://github.com/apache/lucene-solr/blob/master/lucene/misc/src/java/org/apache/lucene/index/PKIndexSplitter.java#L127-L170

関連する問題