`
weitao1026
  • 浏览: 1053154 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene里面的过滤

阅读更多
分别是关于分词和分页的知识,虽然当成插曲写,但是其内容还是比较重要的,因为那些知识在实际的运用以及开发中用的还是比较常见,所以还是要用心的了解一下。

散仙今天要写的是关于过滤方面的知识,也就是Filter,如果了解Solr的朋友们,肯定都会知道Solr里面fq这个参数,这个参数的作用其实就是lucene里面的过滤,对一些q参数查询的结果集,做过滤或者限制返回一些我们需要的内容,可以理解成缩小搜索空间的一种策略。

在这里散仙先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤返回的结果集不带评分操作,而使用Query返回的结果都是带相关性评分的,所以当我们如果有一些跟评分操作没有关系的业务,优先使用Filter操作,将会获取更好的性能,其实这也是Solr里面的q参数跟fq参数的区别。


下面,开始进入正题,在这之前,散仙还是喜欢老生常谈的先来了解一下Lucene里面有关于Filter的整体知识



下面,我们来看下具体的在代码里怎么实现,先来看下我们的测试数据



Java代码 复制代码 收藏代码
1.id      score       bookname    ename       type            price       date 
2.1       1       飘渺之旅        pmzl        小说      52.23       201005       
3.2       1       三国演义        sgyy        小说      36.13       201207       
4.3       1       数据库实战       sjksz       技术      77.13       200811       
5.4       1       编程宝典        bcbd        技术      100.3       200501       
6.5       1       职场关系论       zcgxl       职场      36.59       200501       
7.6       1       健康生活        jksh        生活      20.47       200008       
8.7       1       看清本质        kqbz        社会      10.37       201004       
9.8       1       编程,编程       bcbc        社会      10.37       201004   


核心代码



Java代码 复制代码 收藏代码
1.//使用过滤器   最后一个为true时包含边界部分,为false时不包含边界部分 
2.           //倒数第二个为true时,包含查询边界,为false时不包含 
3.           TermRangeFilter filter=new TermRangeFilter("ename", new BytesRef("h"), new BytesRef("n"), true, true); 
4.           TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),filter,10000);//默认无排序方式 


输出结果



Java代码 复制代码 收藏代码
1.6       1       健康生活        jksh        生活      20.47       200008       
2.7       1       看清本质        kqbz        社会      10.37       201004   


核心代码



Java代码 复制代码 收藏代码
1.NumericRangeFilter<Double> filter=NumericRangeFilter.newDoubleRange("price", 10D, 40D, true, false); 
2.  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),filter,10000);//默认无排序方式 


输出结果



Java代码 复制代码 收藏代码
1.2       1       三国演义        sgyy        小说      36.13       201207       
2.5       1       职场关系论       zcgxl       职场      36.59       200501       
3.6       1       健康生活        jksh        生活      20.47       200008       
4.7       1       看清本质        kqbz        社会      10.37       201004       
5.8       1       编程,编程       bcbc        社会      10.37       201004 



核心代码



Java代码 复制代码 收藏代码
1.//使用缓存过滤 
2.    Filter filter=FieldCacheRangeFilter.newDoubleRange("price", 20D, 50D, true, true); 
3.    TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),filter,10000);//默认无排序方式 


输出结果



Java代码 复制代码 收藏代码
1.2       1       三国演义        sgyy        小说      36.13       201207       
2.5       1       职场关系论       zcgxl       职场      36.59       200501       
3.6       1       健康生活        jksh        生活      20.47       200008   


核心代码



Java代码 复制代码 收藏代码
1.// 缓存域过滤特定的类别 
2. Filter filter=new FieldCacheTermsFilter("type", new String[]{"技术","社会"}); 
3. TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),filter,10000);//默认无排序方式 


输出结果



Java代码 复制代码 收藏代码
1.3       1       数据库实战       sjksz       技术      77.13       200811       
2.4       1       编程宝典        bcbd        技术      100.3       200501       
3.7       1       看清本质        kqbz        社会      10.37       201004       
4.8       1       编程,编程       bcbc        社会      10.37       201004   


核心代码



Java代码 复制代码 收藏代码
1.//使用QueryWrapperFilter类包装一个Query 
2.         QueryWrapperFilter  filter=new QueryWrapperFilter(new TermQuery(new Term("type", "技术"))); 
3.         TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),filter,10000);//默认无排序方式 


输出结果



Java代码 复制代码 收藏代码
1.3       1       数据库实战       sjksz       技术      77.13       200811       
2.4       1       编程宝典        bcbd        技术      100.3       200501   



最后我来看下,如何继承Filter基类,来定制我们自己的filter,自定义的Filter,虽然某些时候,功能很强大灵活,但是有几个缺点,我们的了解1,保证是内容不重复的字段,例如主键,如果重复,默认返回第一个作为结果集显示2,保证不能被分词的内容,如果是分词的字段,则可能会出现一些不正确的结果。
自定义Filter类



Java代码 复制代码 收藏代码
1.package com.sanjiesanxian.test; 
2. 
3.import java.io.IOException; 
4.import java.util.BitSet; 
5. 
6.import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 
7.import org.apache.lucene.index.AtomicReaderContext; 
8.import org.apache.lucene.index.DocsEnum; 
9.import org.apache.lucene.index.Term; 
10.import org.apache.lucene.search.DocIdSet; 
11.import org.apache.lucene.search.Filter; 
12.import org.apache.lucene.util.AttributeSource; 
13.import org.apache.lucene.util.Bits; 
14.import org.apache.lucene.util.DocIdBitSet; 
15.import org.apache.lucene.util.FixedBitSet; 
16.import org.apache.lucene.util.OpenBitSet; 
17. 
18./***
19. *^_^  ^_^  ^_^
20. * QQ交流探讨群:324714439
21. * 自定义过滤器
22. * @author 三劫散仙
23. * */ 
24.public class MyCustomFilter extends Filter{ 
25.     
26.    public MyCustomFilter() { 
27.        // TODO Auto-generated constructor stub 
28.    } 
29.     
30.    private String[] terms;//限制返回的数据字典 
31.    public MyCustomFilter(String ...terms) { 
32.        // TODO Auto-generated constructor stub 
33.        this.terms=terms; 
34.    } 
35.    @Override 
36.    public DocIdSet getDocIdSet(AtomicReaderContext arg0, Bits arg1) 
37.            throws IOException { 
38.        FixedBitSet bits=new FixedBitSet(arg0.reader().maxDoc())  ;//获取没有所有的docid包括未删除的 
39.         int base=arg0.docBase;//段的相对基数,保证多个段时相对位置正确 
40.         //int limit=base+arg0.reader().maxDoc();//计算最大限制值 
41.        for(String s:terms){ 
42.              DocsEnum doc=arg0.reader().termDocsEnum(new Term("id", s));//必须是唯一的不重复 
43.              //保证是单个不重复的term,如果重复的话,默认会取第一个作为返回结果集,分词后的term也不适用自定义term 
44.              if(doc.nextDoc()!=-1){  
45.                bits.set(doc.docID());//对付符合条件约束的docid循环添加到bits里面 
46.                } 
47.              } 
48.        return bits; 
49.    } 
50.     
51.     
52.     
53.     
54. 
55.     
56.     
57.     
58.} 


测试查询代码



Java代码 复制代码 收藏代码
1.MyCustomFilter filter=new MyCustomFilter("3","5","2");//随意指定1之多个需要过滤的项 
2.TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),filter,10000); 


输出结果



Java代码 复制代码 收藏代码
1.2       1       三国演义        sgyy        小说      36.13       201207       
2.3       1       数据库实战       sjksz       技术      77.13       200811       
3.5       1       职场关系论       zcgxl       职场      36.59       200501   



自定义过滤器虽然有缺点,但是某些场景下却能发挥很灵活的作用,特别是对没有分词的字段进行过滤操作。

关于Lucene过滤部分的使用,散仙就介绍到这里,这些功能其实没什么难的,弄清理论,在练习几遍,就能很快学会了
分享到:
评论

相关推荐

    第一个lucene的简单实例....

    从压缩包文件 "lucenetest" 来看,我们可以预期里面包含了实现这个简单实例的源代码。这些文件可能包含以下几个部分: 1. **索引创建**:通常会有一个类用于读取数据(如文本文件或数据库记录),然后使用Lucene的`...

    ELK学习资料

    本文档是整套的elk学习资源,内容详细 ES5.0新版本特性 1.支持lucene 6.x:索引性能提升 提升25% 磁盘占用少了 2.新增sliced scroll类型:并发...5.新增ingest节点 直接在es中进行简单的过滤 不需要在logstash里面过滤

    ikanalyzer2.0.2源码

    2. **org目录**:这个目录下的文件主要是ikanalyzer的组织结构,包含类库和接口,例如`org.icat`包,它是ikanalyzer的核心包,里面包含了分词器、过滤器等关键组件。如`Analyzer`接口定义了分词器的基本操作,`...

    IKAnalyzer2012_u3.zip

    1. `stopword.dic`:停用词表,包含了在分析文本时通常会被过滤掉的常见词汇,如“的”、“和”等,以减少无效信息对后续处理的影响。 2. `Readme-说明.htm`:通常包含软件的使用指南、注意事项和更新日志,用户...

    windowsES.zip

    Elasticsearch是一款强大的开源搜索引擎,它基于Lucene,提供了实时、分布式、全文检索的能力。在本文中,我们将详细介绍如何在Windows上安装Elasticsearch,以及如何安装和配置其插件,特别是ik分词器。 首先,让...

    elasticsearch-tool

    Elasticsearch是一款强大的开源搜索引擎,基于Lucene库构建,广泛应用于大数据分析、日志收集、实时搜索等场景。它以其高效、可扩展和易用性而受到开发者们的喜爱。本项目"elasticsearch-tool"显然是一个与Elastic...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包6

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包5

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包10

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包8

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包7

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包9

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包101

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    Java资源包01

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

Global site tag (gtag.js) - Google Analytics