Lucene:通过数字存储字段上的一组允许值进行过滤

时间:2015-12-24 22:21:16

标签: java lucene

是否有一种简单的方法可以应用以下过滤器查询:

userAccessibleDocTypesSet.contains(doc.type)

将set传递给查询(带有分散的整数),doc.type是文档中存储的int字段。 对于集合中所有值都带有should子句的BooleanQuery似乎有点过分,可能会超出限制。

什么是正确的方法?如果由于用户的完全访问权限而未过滤任何内容,最后如何应用此过滤器?

1 个答案:

答案 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)";
    }
}