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

本文介绍如何在Lucene中实现一个自定义过滤器,该过滤器能够隐藏已删除的索引记录,确保搜索结果中不包含这些记录。具体实现包括创建OpenBitSet并根据指定ID列表标记要排除的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

案例:

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值