是否有一种简单的方法可以应用以下过滤器查询:
userAccessibleDocTypesSet.contains(doc.type)
将set传递给查询(带有分散的整数),doc.type是文档中存储的int字段。 对于集合中所有值都带有should子句的BooleanQuery似乎有点过分,可能会超出限制。
什么是正确的方法?如果由于用户的完全访问权限而未过滤任何内容,最后如何应用此过滤器?
答案 0 :(得分:1)
这就是我想出的。如果您发现任何性能问题,请告知我们。
public class FilterByIntegerSetQuery extends Query
{
protected String numericDocValueFieldName;
protected Set<Integer> allowedValues;
public FilterByIntegerSetQuery(String numericDocValueFieldName, Set<Integer> allowedValues)
{
this.numericDocValueFieldName = numericDocValueFieldName;
this.allowedValues = allowedValues;
}
@Override
public Weight createWeight(IndexSearcher searcher, boolean needsScores)
{
return new RandomAccessWeight(this)
{
@Override
protected Bits getMatchingDocs(LeafReaderContext context) throws IOException
{
final int len = context.reader().maxDoc();
final NumericDocValues values = context.reader().getNumericDocValues(numericDocValueFieldName);
return new Bits()
{
@Override
public boolean get(int index)
{
return allowedValues.contains((int) values.get(index));
}
@Override
public int length()
{
return len;
}
};
}
};
}
@Override
public String toString(String field)
{
return "(filter "+numericDocValueFieldName+" by set)";
}
}