• lucene Filter过滤器


    摘自:http://iamyida.iteye.com/blog/2199368

    1.TermFilter:就是按照Term去过滤,跟TermQuery类似: 

    Filter filter = new TermFilter(new Term("subject","junit"));

    2.TermsFilter:它是用来进行多Term过滤的,是相对于TermFilter的:

    Filter filter = new TermsFilter(new Term[] {  
         new Term("subject","lucene"),  
         new Term("pubmonth","201005")  
     });

    3.FieldValueFilter:仅仅是对单个域进行过滤,即只返回包含指定域的索引文档,对域值没有进行限定

    //negate表示是否取反,默认是包含指定域,取反意思就是不包含指定域 
    Filter filter = new FieldValueFilter("category", false); 

    4.BooleanFilter:用来链接多个Filter的,类似于BooleanQuery

    BooleanFilter booleanFilter = new BooleanFilter();  
    booleanFilter.add(filter1, Occur.MUST);  
    booleanFilter.add(filter2, Occur.MUST);  

     MUST:表示必须符合

       MUST_NOT:与MUST相对应,取MUST的否定,即必须不符合

       SHOULD:在英语表示一种很委婉的语气,即可以的意思,不是强制性的,即可有可无的意思.

    5.QueryWrapperFilter:用来把Query包装成一个Filter

            Query query = new TermQuery(new Term("title","junit"));  
            //把一个Query对象包装成一个Filter对象  
            Filter filter1 = new QueryWrapperFilter(query);  
            //title域中a-j范围内的,包含a,j两个边界  
            Filter filter2 = TermRangeFilter.newStringRange("title", "a", "j", true, true);  
              
            BooleanFilter booleanFilter = new BooleanFilter();  
            booleanFilter.add(filter1, Occur.MUST);  
            booleanFilter.add(filter2, Occur.MUST);      

    6.DuplicateFilter:用来去除重复索引文档的

    7.MultiTermQueryWrapperFilter:把MultiTermQuery包装成一个Filter,其下面派生了很多子Filter

      TermRangeFilter:用进行字符串型Field的范围过滤的,跟TermRangeQuery用法类似,只是Filter不进行打分操作

    Filter filter2 = TermRangeFilter.newStringRange("title", "a", "j", true, true); 

      NumericRangeFilter:对数字域进行范围过滤的Filter,跟NumericRangeQuery很类似

    Filter filter2 = NumericRangeFilter.newIntRange("pubmonth", 199908, 201005, true, true);

      PrefixFilter:与PrefixQuery对应,即过滤出以xxxx打头的索引文档

    Filter filter2 = new PrefixFilter(new Term("title","lucene"));

    8.DocValuesRangeFilter:用来进行范围过滤的,DocValuesRangeFilter是与DocValuesFiled域对应的,即它只适用于对DocValuesFiled进行范围过滤,它不能直接通过构造函数进行构建,它是通过内部提供的静态方法来构建的

    //先把搜索范围限定在 pubmonth in[199901 to 201005]的索引文档 
    Filter filter = DocValuesRangeFilter  
                .newIntRange("pubmonth", 199901, 201005, true, true);

    9.CachingWrapperFilter:包装类,即把Filter包装为一个包含缓存功能的Filter,也是典型的装饰者模式,SegmentCoreReaders就是把当前的indexReader的克隆对象缓存了一份,其实就是key是和当前的indexReader对应的,所以在用CachingWrapperFilter的时候,你要保证前后两次你使用的是同一个IndexReader对象,只有这样你使用CachingWrapperFilter才会利用到缓存,否则你还是会重新去执行Filter的过滤操作。

    Filter filter = new CachingWrapperFilter(new TermFilter(new Term("subject","junit")));

     10.自定义过滤器:继承Filter基类

    public class MyCustomFilter extends Filter{  
          
        public MyCustomFilter() {  
            // TODO Auto-generated constructor stub  
        }  
          
        private String[] terms;//限制返回的数据字典  
        public MyCustomFilter(String ...terms) {  
            // TODO Auto-generated constructor stub  
            this.terms=terms;  
        }  
        @Override  
        public DocIdSet getDocIdSet(AtomicReaderContext arg0, Bits arg1)  
                throws IOException {  
            FixedBitSet bits=new FixedBitSet(arg0.reader().maxDoc())  ;//获取没有所有的docid包括未删除的  
             int base=arg0.docBase;//段的相对基数,保证多个段时相对位置正确  
             //int limit=base+arg0.reader().maxDoc();//计算最大限制值  
            for(String s:terms){  
                  DocsEnum doc=arg0.reader().termDocsEnum(new Term("id", s));//必须是唯一的不重复  
                  //保证是单个不重复的term,如果重复的话,默认会取第一个作为返回结果集,分词后的term也不适用自定义term  
                  if(doc.nextDoc()!=-1){   
                    bits.set(doc.docID());//对付符合条件约束的docid循环添加到bits里面  
                    }  
                  }  
            return bits;  
        }  
  • 相关阅读:
    5
    4
    3
    crontab -e 报错(E518: Unknown option: foldenable)
    解决无法修改日志时间的问题(Local time zone must be set--see zic manual page 2019 )
    ping测试丢包率
    关闭SELinux
    iotop使用方法
    mysql的备份
    修改uid gid 的起始范围
  • 原文地址:https://www.cnblogs.com/qingyibusi/p/6235856.html
Copyright © 2020-2023  润新知