`

二十、自定义过滤器

 
阅读更多

有的应用有些要求,对于某类型的内容即使满足条件了,但是也不能被搜索出来,lucene中提供了过滤器的功能,

通过自定义的过滤器继承Filter,从 而实现特定的过滤功能。Filter是一种过滤行为BitSet是一种位集合队列,

这个队列中只有两种取值,TRUE或FALSE,LUCENE以这两种取值代表文档是否被过 滤,也就是说,LUCENE返回结果时,

会首先遍历BITSET,仅将那些对应值为TRUE的文档返回。


public interface FilterAccessor {

    public String[] values();
   
    public String getField();
   
    public boolean set();
}



public class MyIDFilter extends Filter {
   
    private FilterAccessor accessor;
   
    public MyIDFilter(FilterAccessor accessor) {
        this.accessor = accessor;
    }

    @Override
    public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
        //创建一个bit,默认所有的元素都是0,表示都不显示

        OpenBitSet obs = new OpenBitSet(reader.maxDoc());
        if(accessor.set()) {
            set(reader,obs);
        } else {
            clear(reader, obs);
        }
        return obs;
    }
   
    private void set(IndexReader reader,OpenBitSet obs) {
        try {
            int[] docs = new int[1];
            int [] freqs = new int[1];
            //获取id所在的doc的位置,并且将其设置为0
            for(String delId:accessor.values()) {
                //获取TermDocs
                TermDocs tds = reader.termDocs(new Term(accessor.getField(),delId));
                //会见查询出来的对象的位置存储到docs中,出现的频率存储到freqs中,返回获取的条数
                int count = tds.read(docs, freqs);
                if(count==1) {
                    obs.set(docs[0]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    private void clear(IndexReader reader,OpenBitSet obs) {
        try {
            //先把元素填满,整个集合设置为TRUE,表示当前集合内的所有文档都是可以被检索到的

            obs.set(0,reader.maxDoc());
            int[] docs = new int[1];
            int [] freqs = new int[1];
           
            for(String delId:accessor.values()) {
                //获取TermDocs
                TermDocs tds = reader.termDocs(new Term(accessor.getField(),delId));
                //会见查询出来的对象的位置存储到docs中,出现的频率存储到freqs中,返回获取的条数
                int count = tds.read(docs, freqs);
                if(count==1) {
                    //将这个位置的元素删除
                    obs.clear(docs[0]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}



public void searchByCustomFilter() {
        try {
            IndexSearcher searcher = new IndexSearcher(IndexReader.open(FileIndexUtils.getDirectory()));
            Query q = new TermQuery(new Term("content","java"));
            TopDocs tds = null;
            tds = searcher.search(q,
new MyIDFilter(new FilterAccessor() {
                @Override
                public String[] values() {
                    return new String[]{"Ant.she","Ant.txt","java.txt"};
                }
                @Override
                public boolean set() {
                    return true;
                }
                @Override
                public String getField() {
                    return "filename";
                }
            }),200);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            for(ScoreDoc sd:tds.scoreDocs) {
                Document d = searcher.doc(sd.doc);
                System.out.println(sd.doc+":("+sd.score+")" +
                        "["+d.get("filename")+"【"+d.get("path")+"】--->"+
                        d.get("size")+"------------>"+d.get("id"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

分享到:
评论

相关推荐

    spring security 4 小例子带自定义过滤器

    在Spring Security 4中,我们可以通过自定义过滤器来扩展其功能,以满足特定的安全需求。在这个小例子中,我们将探讨如何创建并集成自定义过滤器,以及它在Spring Security中的工作原理。 首先,我们需要理解Spring...

    Java自定义过滤器

    ### Java自定义过滤器知识点详解 #### 一、概述 在Java Web开发中,过滤器(Filter)是一种非常实用的功能,它可以对用户请求进行预处理或对响应进行后处理。通过配置过滤器,开发者可以在不修改任何现有代码的...

    struts2实例 自定义过滤器 文件上传下载 登录功能

    本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...

    GridControl的过滤器的自定义

    为了实现自定义过滤器,我们可以使用 DevExpress 的 GridControl 提供的 FilterControl 事件。在这个事件中,我们可以编写自定义的过滤器逻辑来处理复杂的查询操作。下面是一个简单的示例代码: ```csharp private ...

    Aspdotnet2_0中自定义过滤器对Response内容进行处理

    二、创建自定义过滤器 要创建自定义过滤器,首先需要继承适当的过滤器基类。对于处理响应内容,我们可以继承`System.Web.Mvc.ActionFilterAttribute`。然后,重写`OnResultExecuted`或`OnResultExecuting`方法。这两...

    vue 内置过滤器的使用总结(附加自定义过滤器)

    Vue不仅内置了一些过滤器,还允许开发者自定义过滤器以满足特定需求。 首先,我们来看看Vue内置过滤器的使用。 Vue内置过滤器非常丰富,包括但不限于: - `capitalize`:将字符串首字母大写。 - `uppercase`:将...

    javaFilter自定义编码过滤器

    二、自定义编码过滤器 在上面的代码中,我们定义了一个名为 EncodingFilter 的自定义编码过滤器,该过滤器用于防止中文乱码。该过滤器实现了 Filter 接口,并重写了 init()、doFilter() 和 destroy() 方法。 * ...

    CAS客户端自定义核心过滤器

    CAS客户端自定义核心过滤器,继承CAS的AbstractCasFilter自定义AuthenticationFilter

    vue自定义过滤器,例如给文字加颜色

    vue.js的filter定义的方式,已经简单的demo,自定义过滤器如何给文字加颜色

    ABP:添加Block Plus自定义过滤器

    在本场景中,我们关注的是如何在ABP框架中添加Block Plus自定义过滤器。Block Plus是一种增强AngularJS应用功能的插件,它提供了一种便捷的方式来创建和管理自定义过滤器,从而对数据进行处理和格式化。 在...

    SpringSecurity学习之自定义过滤器的实现代码

    "SpringSecurity学习之自定义过滤器的实现代码" Spring Security学习之自定义过滤器的实现代码主要介绍了Spring Security学习之自定义过滤器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...

    深入理解Django的自定义过滤器

    在Django框架中,自定义过滤器是一个强大的特性,它允许开发者扩展模板语言的功能,以处理特定的逻辑操作。过滤器本质上是Python函数,它们接收一个值作为输入,然后对其进行处理,返回一个新的值。在本文中,我们将...

    java自定义filter过滤特定请求并记录日志

    自定义过滤器,过滤请求接口的请求,认证用户并记录日志

    django 自定义过滤器的实现

    #### 二、自定义过滤器的基础概念 自定义过滤器本质上就是一个Python函数,它可以接收一个或两个参数,然后返回处理后的结果。这些过滤器可以在Django的模板文件中被调用,用来格式化数据、执行简单的逻辑操作等。...

    matlab自定义过滤器为先生的HDMI缩放.zip

    在本项目中,“matlab自定义过滤器为先生的HDMI缩放.zip”是一个包含MATLAB源码的压缩包,用于实现自定义的过滤器,主要用于处理HDMI信号的缩放问题。MATLAB是一种强大的数学计算和编程环境,特别适合进行信号处理和...

    springmvc+shiro自定义过滤器的实现代码

    SpringMVC+Shiro自定义过滤器的实现代码 itle"springmvc+shiro自定义过滤器的实现代码"所涉及的知识点如下: 1. SpringMVC拦截器 在SpringMVC中,拦截器(Interceptor)是一种特殊的Bean,它可以在请求处理之前、...

Global site tag (gtag.js) - Google Analytics