mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-09 22:45:04 +00:00
improve boolean filter
This commit is contained in:
parent
ed8c289dec
commit
62bc0836c1
@ -22,11 +22,11 @@ package org.elasticsearch.common.lucene.search;
|
|||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
import org.apache.lucene.search.BooleanClause;
|
import org.apache.lucene.search.BooleanClause;
|
||||||
import org.apache.lucene.search.DocIdSet;
|
import org.apache.lucene.search.DocIdSet;
|
||||||
import org.apache.lucene.search.DocIdSetIterator;
|
|
||||||
import org.apache.lucene.search.Filter;
|
import org.apache.lucene.search.Filter;
|
||||||
import org.apache.lucene.search.FilterClause;
|
import org.apache.lucene.search.FilterClause;
|
||||||
import org.apache.lucene.util.FixedBitSet;
|
import org.apache.lucene.util.FixedBitSet;
|
||||||
import org.apache.lucene.util.OpenBitSetDISI;
|
import org.apache.lucene.util.OpenBitSetDISI;
|
||||||
|
import org.elasticsearch.common.lucene.docset.DocSet;
|
||||||
import org.elasticsearch.common.lucene.docset.DocSets;
|
import org.elasticsearch.common.lucene.docset.DocSets;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -42,17 +42,13 @@ public class XBooleanFilter extends Filter {
|
|||||||
ArrayList<Filter> notFilters = null;
|
ArrayList<Filter> notFilters = null;
|
||||||
ArrayList<Filter> mustFilters = null;
|
ArrayList<Filter> mustFilters = null;
|
||||||
|
|
||||||
private DocIdSetIterator getDISI(ArrayList<Filter> filters, int index, IndexReader reader)
|
private DocIdSet getDISI(ArrayList<Filter> filters, int index, IndexReader reader)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
DocIdSet docIdSet = filters.get(index).getDocIdSet(reader);
|
DocIdSet docIdSet = filters.get(index).getDocIdSet(reader);
|
||||||
if (docIdSet == null) {
|
if (docIdSet == DocIdSet.EMPTY_DOCIDSET || docIdSet == DocSet.EMPTY_DOC_SET) {
|
||||||
return DocIdSet.EMPTY_DOCIDSET.iterator();
|
return null;
|
||||||
}
|
}
|
||||||
DocIdSetIterator iterator = docIdSet.iterator();
|
return docIdSet;
|
||||||
if (iterator == null) {
|
|
||||||
return DocIdSet.EMPTY_DOCIDSET.iterator();
|
|
||||||
}
|
|
||||||
return iterator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Filter> getShouldFilters() {
|
public List<Filter> getShouldFilters() {
|
||||||
@ -77,34 +73,39 @@ public class XBooleanFilter extends Filter {
|
|||||||
|
|
||||||
if (shouldFilters != null) {
|
if (shouldFilters != null) {
|
||||||
for (int i = 0; i < shouldFilters.size(); i++) {
|
for (int i = 0; i < shouldFilters.size(); i++) {
|
||||||
|
final DocIdSet disi = getDISI(shouldFilters, i, reader);
|
||||||
|
if (disi == null) continue;
|
||||||
if (res == null) {
|
if (res == null) {
|
||||||
res = DocSets.createFixedBitSet(getDISI(shouldFilters, i, reader), reader.maxDoc());
|
res = new FixedBitSet(reader.maxDoc());
|
||||||
} else {
|
|
||||||
DocIdSet dis = shouldFilters.get(i).getDocIdSet(reader);
|
|
||||||
DocSets.or(res, dis);
|
|
||||||
}
|
}
|
||||||
|
DocSets.or(res, disi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notFilters != null) {
|
if (notFilters != null) {
|
||||||
for (int i = 0; i < notFilters.size(); i++) {
|
for (int i = 0; i < notFilters.size(); i++) {
|
||||||
if (res == null) {
|
if (res == null) {
|
||||||
res = DocSets.createFixedBitSet(getDISI(notFilters, i, reader), reader.maxDoc());
|
res = new FixedBitSet(reader.maxDoc());
|
||||||
res.flip(0, reader.maxDoc()); // NOTE: may set bits on deleted docs
|
res.set(0, reader.maxDoc()); // NOTE: may set bits on deleted docs
|
||||||
} else {
|
}
|
||||||
DocIdSet dis = notFilters.get(i).getDocIdSet(reader);
|
final DocIdSet disi = getDISI(notFilters, i, reader);
|
||||||
DocSets.andNot(res, dis);
|
if (disi != null) {
|
||||||
|
DocSets.andNot(res, disi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mustFilters != null) {
|
if (mustFilters != null) {
|
||||||
for (int i = 0; i < mustFilters.size(); i++) {
|
for (int i = 0; i < mustFilters.size(); i++) {
|
||||||
|
final DocIdSet disi = getDISI(mustFilters, i, reader);
|
||||||
|
if (disi == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
if (res == null) {
|
if (res == null) {
|
||||||
res = DocSets.createFixedBitSet(getDISI(mustFilters, i, reader), reader.maxDoc());
|
res = new FixedBitSet(reader.maxDoc());
|
||||||
|
DocSets.or(res, disi);
|
||||||
} else {
|
} else {
|
||||||
DocIdSet dis = mustFilters.get(i).getDocIdSet(reader);
|
DocSets.and(res, disi);
|
||||||
DocSets.and(res, dis);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user