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;
}
lucene Filter过滤器的更多相关文章
- filter 过滤器(监听)
Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...
- Java防止SQL注入2(通过filter过滤器功能进行拦截)
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
- Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- javaweb学习总结(四十二)——Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- Filter过滤器简单应用( 接口访问控制 )
一.描述 在提供安卓.IOS客户端接口时,可以在登陆接口分配Session给客户端,用于判断其他接口是否是合法访问,以避免将所有的接口都暴露在web中可以由路径直接访问.但是最近的一个项目中的移动接口 ...
- 如何配置Filter过滤器处理JSP中文乱码
参考Tomcat服务器目录webapps的examples示例 简单配置步骤:1.在项目web.xml文件添加过滤器标记<filter>和<filter-mapping>:2. ...
- Filter(过滤器)常见应用
孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...
- Filter过滤器(1)
Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...
- Servlet的学习之Filter过滤器技术(1)
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
随机推荐
- SQL 使用存储过程创建报表的一点体会
以前创建报表的时候都是采用视图的方式来实现的,通过把关联的表字段选取后形成需要的报表,用起来也比较方便. 最近也尝试用存储过程来做一些开发,确实也方便不少,因为很多逻辑关系都可以灵活的在SQL来实现, ...
- C# .Net 使用zxing.dll生成二维码,条形码
public static string GetBarcode(string format, string value, int? width, int? height) { ...
- [重构到模式-Chain of Responsibility Pattern]把Fizz Buzz招式重构到责任链模式
写一段程序从1打印到100,但是遇到3的倍数时打印Fizz,遇到5的倍数时打印Buzz,遇到即是3的倍数同时也是5的倍数时打印FizzBuzz.例如: 1 2 Fizz 4 Buzz Fizz 7 8 ...
- c++字符串连接方法大观
c++字符串连接方法大观 抛砖引玉: springf(config_itemID[i],"ItemID%s_%d",i,i); 大家说说自己都用什么方法,个有什么利弊呢?
- 定义文件XML——从简单开始
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 通过看XML讲授的视频,算是对XML有了简略的认识,原本不盘算写这篇博客,但无法原来视频讲授的内容就少,再不踊跃写些东西,过不 ...
- 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
我比较喜欢听音乐,特别是周末的时候,电脑开着百度随心听fm,随机播放歌曲,躺在床上享受.但碰到了一个烦人的事情,想切掉不喜欢的曲子,还得起床去操作电脑换歌.于是思考能不能用手机控制电脑切换歌曲,经过一 ...
- redis 学习笔记——redis集群
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- 700多个PHP版本随时切换,PHPWAMP共生模式与多档位综合教程。
最近有学生向我咨询如何同时建立多个不同PHP版本站点,并自定义任意版本,软件是否可以多开,PHPWAMP如何设置才能与其他的环境同时使用等问题,本文将一一解决. 简单介绍一下PHPWAMP 你们应该会 ...
- appium+robotframework的简单实例
在上篇文章中,我们搭建好了appium+robotframework的环境,这篇文章中主要是一个简单实例. 一.测试用例编写前提 1.模拟器(或手机)连接电脑 adb devices ...
- 设计模式 -- 亨元模式(FlyWeight Pattern)
用来尽可能减少内存使用量,适用于存在大量重复对象的场景,达到对象共享,避免创建过多对象的效果,提升性能,避免内存溢出. 定义: 使用共享对象有效支持大量细粒度对象. 适用场景: 系统中存在大量相似对象 ...