18、学习Lucene3.5索引之自定义过滤器(Filter)

使用场景:比如限时特价,就可用通过过滤器,只显示符合条件的特价商品

案例:

1、自定义过滤器

public class MyFilter extends Filter {
    /**
     * 目的:实现所有被删掉的索引,不再显示
     * 思路:利用OpenBitSet对象,设置所有被搜索出来的对象值为1(set()),然后利用被删除条目的id,去搜索
     *       索引,将搜索出来的索引宰置为0(clear())
     * @param reader
     * @return
     * @throws IOException
     */
    private String[] delId = new String[]{"1", "2", "3", "7"};
    @Override
    public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
        //1.先创建一个OpenBitSet,默认所有元素都是0(规则是:值为0的将会被过滤掉)
        OpenBitSet obs = new OpenBitSet(reader.maxDoc());
        //2.所有元素都置为1
        obs.set(0, reader.maxDoc());

        int[] docs = new int[1];
        int[] freqs = new int[1];
        //3.获取id所在的doc,并将其置为0
        for (String id : delId){
            //4.获取TermDocs
            TermDocs termDocs = reader.termDocs(new Term("id", id));
            //5.会将查询出来对象的位置信息存储到“docs”中,出现的频率存储到“freqs”中,返回获取的条数
            int count = termDocs.read(docs, freqs);
            if (count == 1){
                //6.将这个位置的元素置为“0”
                obs.clear(docs[0]);
            }
        }
        return obs;
    }
}

2.使用过滤器

topDocs = indexSearcher.search(termQuery, filter, 100);

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/79560566