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

Lucene里面Collector

阅读更多
我们先来回顾下,一个基本的搜索流程是怎么完成的
1,得到一个索引目录Directory(可能基于内存的或者磁盘的)。
2,得到一个DirectoryReader。
3,实例化查询组件IndexSearcher。
4,检索得到TopDoc查询结果集
5,遍历ScoresDocs处理结果


我们看下这个检索的流程,大概可以分这5步,前1,2,3算是准备工作,后面的2步是我们经常需要进行数据处理的地方,那么我们Collector到底工作在哪一步呢?,其实Collector真正的起作用是在3-4步之间的。

那么Collector的作用是干什么的?为什么需要使用Collector?

在这之前先分析下TopDocs这个类,这个类的工作原理,其实在后台使用的也是一个收集器,收收集我们检索的结果,通过TopDocsCollector这个基类下面的2个子类收集器,来收集一次我们检索的命中数据。
所以collector的作用就是收集某些我们需要定制化的结果集,某些情况下使用collector可以可以极大的提升我们程序的性能,通过collector可以让我们对每一个匹配上的文档做一些特有的定制化操作,当然前提是在我们需要使用的情况下。
下面我们来看下collector基类的几个方法




方法 说明
collect() 检索时,每匹配上一个文档,都会调用此方法
acceptsDocsOutOfOrder() 测试本collector是否能处理无序到达的docid
setScorer(Scorer scorer)  处理检索结果的评分
setNextReader(AtomicReaderContext context)  检索时,在多个索引段结构之间切换的方法



下面我们来看下自定义的一个collector来实现ScoreDoc类的功能,代码如下.




Java代码 复制代码 收藏代码
1.package com.piaoxuexianjing; 
2. 
3.import java.io.IOException; 
4.import java.util.ArrayList; 
5.import java.util.List; 
6. 
7.import org.apache.lucene.index.AtomicReaderContext; 
8.import org.apache.lucene.search.Collector; 
9.import org.apache.lucene.search.ScoreDoc; 
10.import org.apache.lucene.search.Scorer; 
11. 
12./**
13. * @author 三劫散仙
14. * @version 1.0
15. * 
16. * 自定义收集器
17. * 实现评分收集
18. * **/ 
19.public class MyScoreCollector extends Collector { 
20.    //private HashMap<String, String> documents=new HashMap<String, String>(); 
21.    List<ScoreDoc> docs=new ArrayList<ScoreDoc>(); 
22.    private Scorer scorer;//scorer类 
23.    private int docBase;//全局相对段基数 
24.      
25. 
26.    @Override 
27.    public boolean acceptsDocsOutOfOrder() { 
28.        // TODO Auto-generated method stub 
29.        //返回true是允许无次序的ID 
30.        //返回false必须是有次序的 
31.        return true; 
32.    } 
33. 
34.    @Override 
35.    public void collect(int arg0) throws IOException { 
36.        /**
37.         * 匹配上一个文档
38.         * 就记录其docid与打分情况
39.         * 
40.         * */ 
41.        docs.add(new ScoreDoc(arg0+docBase,scorer.score()));// 
42.    } 
43.//  BinaryDocValues names;//字符类型的内置存储 
44.//  BinaryDocValues bookNames;//字符类型的内置存储 
45.//  BinaryDocValues ids;//字符类型的内置存储 
46.//  BinaryDocValues prices;//字符类型的内置存储 
47.//  FieldCache.Doubles d ; //数值类型的内置存储 
48.//  FieldCache.Ints ints;//数值类型的内置存储 
49.    @Override 
50.    public void setNextReader(AtomicReaderContext arg0) throws IOException { 
51.        this.docBase=arg0.docBase;//记录每个索引段结构的相对位置 
52.    } 
53. 
54.    @Override 
55.    public void setScorer(Scorer arg0) throws IOException { 
56.        // TODO Auto-generated method stub 
57.        this.scorer=arg0;//记录改匹配的打分情况 
58.         
59.    } 
60.     
61.     
62.     
63. 
64.} 


测试类的核心代码



Java代码 复制代码 收藏代码
1.//自定义收集器 
2. MyScoreCollector  scoreCollector=new MyScoreCollector(); 
3.searcher.search(new MatchAllDocsQuery(), scoreCollector); 
4./**
5. * 自定义的收集类,实现效果===>ScoreDocs类
6. * **/ 
7.List<ScoreDoc> s=scoreCollector.docs; 
8.for(ScoreDoc sc:s){ 
9. System.out.println(sc.doc+"===="+sc.score); 
10.} 


输出结果如下



Java代码 复制代码 收藏代码
1.0====1.0 
2.1====1.0 
3.2====1.0 
4.3====1.0 
5.4====1.0 
6.5====1.0 
7.6====1.0 
8.7====1.0 



至此,我们就利用自定义的collector完成了一个简单的收集评分功能,当然我们可以根据自己的业务,来实现各种各样的collector,灵活运用!
分享到:
评论

相关推荐

    lucene collector的使用

    而Lucene Collector则是其中一个重要组件,它负责在查询执行过程中收集满足条件的文档,并对这些文档进行进一步处理。本篇文章将深入探讨Lucene Collector的使用以及在分组统计中的应用。 首先,我们要理解Lucene的...

    Lucene5学习之自定义Collector

    这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...

    Lucene collector-开源

    源代码通常按照模块组织,可能包括新的 Collector 类和其他辅助类,开发者可以通过阅读和学习这些源码来深入理解 Lucene 收集器的工作原理,并根据自己的需求进行定制。 在实际应用中,使用这些扩展的 Lucene 收集...

    Annotated Lucene 中文版 Lucene源码剖析

    这一过程涉及到Scorer和Collector,Scorer计算每个文档的相关性分数,而Collector负责收集这些分数并返回结果。 除了基本的搜索功能,Lucene还提供了高级特性,如模糊搜索、短语搜索、近似搜索以及多字段、多语言...

    Lucene资料大全(包括Lucene_in_Action书等)

    5. **过滤与聚合**:Filter和Collector组件可以用于进一步筛选结果,或者进行分组、统计等聚合操作。 6. **更新与删除**:Lucene支持动态索引更新,可以添加、修改或删除文档,并实时反映在搜索结果中。 7. **多...

    用Lucene实现Java里面的搜索引擎

    Apache Lucene是一个高性能、全文本搜索库,它提供了一个强大的框架来构建自定义的搜索引擎应用。本篇将深入探讨如何利用Java和Lucene来实现一个搜索引擎。 首先,我们要理解Lucene的基本概念。Lucene是一个纯Java...

    Lucene group by ,分组实现

    在 Lucene 中,分组功能并不是内建的,但可以通过自定义 collector 来实现。`GroupCollector` 就是这样一个关键组件,它是实现分组搜索的核心类。`GroupCollector` 负责收集在搜索过程中遇到的文档,并根据指定的...

    lucene.net 2.9.1 源码

    5. 响应处理:了解HitCollector和Collector的用法,以及如何自定义结果集的处理逻辑。 四、实战开发 在实际项目中,开发者可以利用Lucene.NET 2.9.1源码进行以下操作: 1. 定制Analyzer:根据特定语言或业务需求,...

    lucene5.3.1增删改查

    3. **执行查询**: 使用IndexSearcher的search(Query, Collector)方法,Collector用于收集查询结果。 4. **获取结果**: ScoreDoc数组包含了查询结果的排序信息,可以使用HitQueue或TopDocs来获取前n个最相关的结果。...

    Lucene3.0.1 官方api

    `Collector`接口则允许自定义结果收集逻辑,实现如分组、聚合等功能。 8. **高亮显示**:Lucene提供了`Highlighter`类,用于在搜索结果中突出显示匹配的关键词,提高用户体验。 9. **多线程支持**:Lucene 3.0.1...

    Lucene组件

    9. **Collector**: 收集器负责在搜索过程中收集匹配的文档,可以选择性地只收集前N个高分文档,以提高效率。 **2. 提高检索效率** 1. **倒排索引优化**: 倒排索引是Lucene高效检索的基础,通过预处理将文档中的...

    Lucene in Action 配套源码

    8. **Filter和Collector**:Filter用于在搜索结果中进行进一步的筛选,而Collector则用于控制如何收集和处理这些结果。这两个组件允许用户自定义搜索逻辑和结果处理。 9. **分布式搜索**:通过Solr或Elasticsearch...

    lucene api

    6. **过滤器(Filter)与收藏集(Collector)**:过滤器可以进一步筛选搜索结果,比如按时间、地理位置或其他条件。收藏集则用于定制搜索结果的收集和处理方式,例如仅收集前N个高分文档。 7. **Highlighter**:...

    lucene 站内搜索示例

    Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了强大的搜索功能,并且被广泛应用于各种项目中,包括网站站内搜索。本示例提供了使用 Lucene 实现站内搜索的具体步骤和代码示例,帮助开发者...

    Lucene5.3.1相关jar包

    9. **Collector**: 在搜索过程中收集匹配的文档,可以自定义实现来满足特定需求,如排序、分页等。 10. **Highlighter**: 提供搜索结果的高亮显示。 总的来说,"Lucene5.3.1相关jar包"包含了构建高效全文搜索引擎所...

    Lucene的一个毕业设计

    - **过滤器与集合器**:Filter 类可以用来限制搜索结果,而 Collector 类可以自定义结果收集行为,比如只获取前 N 个结果。 - **多字段搜索**:可以通过设置多个字段查询,使搜索更加灵活。 **总结** Lucene 的...

    lucene全文检索全面教程

    5. **过滤与聚合**:通过`Filter`和`Collector`可以实现特定条件的筛选和结果聚合。 6. **更新与增量索引**:Lucene支持实时更新,可以仅索引新数据或修改过的数据。 ### 四、实战案例 - **全文检索例子.doc**:...

    lucene-6.6.3.zip

    Lucene 提供了多种扩展点,比如自定义 Analyzer、Filter 和 Collector,以适应不同场景的需求。例如,可以通过自定义 Analyzer 实现更精确的中文分词策略,通过 Filter 进行结果过滤,通过 Collector 实现定制化的...

    lucene_web项目应用实例

    在“lucene_web”项目中,我们还能看到如何利用Lucene的Filter和Collector来实现特定的搜索需求,例如范围查询、模糊查询、短语查询等。同时,通过ScoreDoc和TopDocs类,我们可以获取到每个文档的排名和总匹配数。 ...

    lucene-4.6.0官方文档

    查询执行后,通过Scorer和Collector进行文档评分和收集,决定哪些文档应该返回给用户。 5. **高级特性** Lucene还提供了高级特性,如近似搜索(FuzzySearch)、范围查询(RangeQuery)、通配符查询(WildcardQuery...

Global site tag (gtag.js) - Google Analytics