是否有一种简单的方法应用以下筛选器查询:
userAccessibleDocTypesSet.contains(doc.type)其中,集合被传递给查询(带有散乱的整数),而doc.type是文档上存储的int字段。对集合中的所有值都使用with子句的BooleanQuery似乎过分了,可能会推高限制。
什么是正确的方法?如果由于用户的完全访问权限而没有过滤任何内容,如何最后应用此筛选器?
发布于 2015-12-25 18:54:58
这就是我想出来的。如果你看到任何表现上的问题,请告诉我。
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)";
}
}https://stackoverflow.com/questions/34458362
复制相似问题