- 浏览: 1048284 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1441)
- 软件思想&演讲 (9)
- 行业常识 (250)
- 时时疑问 (5)
- java/guava/python/php/ruby/R/scala/groovy (213)
- struct/spring/springmvc (37)
- mybatis/hibernate/JPA (10)
- mysql/oracle/sqlserver/db2/mongdb/redis/neo4j/GreenPlum/Teradata/hsqldb/Derby/sakila (268)
- js/jquery/jqueryUi/jqueryEaseyUI/extjs/angulrJs/react/es6/grunt/zepto/raphael (81)
- ZMQ/RabbitMQ/ActiveMQ/JMS/kafka (17)
- lucene/solr/nuth/elasticsearch/MG4J (167)
- html/css/ionic/nodejs/bootstrap (19)
- Linux/shell/centos (56)
- cvs/svn/git/sourceTree/gradle/ant/maven/mantis/docker/Kubernetes (26)
- sonatype nexus (1)
- tomcat/jetty/netty/jboss (9)
- 工具 (17)
- ETL/SPASS/MATLAB/RapidMiner/weka/kettle/DataX/Kylin (11)
- hadoop/spark/Hbase/Hive/pig/Zookeeper/HAWQ/cloudera/Impala/Oozie (190)
- ios/swift/android (9)
- 机器学习&算法&大数据 (18)
- Mesos是Apache下的开源分布式资源管理框架 (1)
- echarts/d3/highCharts/tableau (1)
- 行业技能图谱 (1)
- 大数据可视化 (2)
- tornado/ansible/twisted (2)
- Nagios/Cacti/Zabbix (0)
- eclipse/intellijIDEA/webstorm (5)
- cvs/svn/git/sourceTree/gradle/jira/bitbucket (4)
- jsp/jsf/flex/ZKoss (0)
- 测试技术 (2)
- splunk/flunm (2)
- 高并发/大数据量 (1)
- freemarker/vector/thymeleaf (1)
- docker/Kubernetes (2)
- dubbo/ESB/dubboX/wso2 (2)
最新评论
我们先来回顾下,一个基本的搜索流程是怎么完成的
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,灵活运用!
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,灵活运用!
发表评论
-
elasticsearch异常信息汇总
2017-11-06 09:34 15421.IndexMissingException 异常信息 ... -
Elasticsearch的架构
2018-03-22 10:30 507为什么要学习架构? Elasticsearch的一些架构 ... -
怎么在Ubuntu上打开端口
2017-10-21 20:45 0Netstat -tln 命令是用来查看linux的端口使用情 ... -
Elasticsearch工作原理
2018-03-22 10:30 448一、关于搜索引擎 各 ... -
Elasticsearch的路由(Routing)特性
2017-10-11 10:41 0Elasticsearch路由机制介 ... -
Elasticsearch中的segment理解
2017-10-11 09:58 1876在Elasticsearch中, 需要搞清楚几个名词,如se ... -
Elasticsearch的路由(Routing)特性
2017-09-28 16:52 614Elasticsearch路由机制介绍 Elastics ... -
Elasticsearch 的 Shard 和 Segment
2017-09-28 16:05 1198Shard(分片) 一个Shard就是一个Lu ... -
开源大数据查询分析引擎现状
2017-09-22 03:04 828大数据查询分析是云计算中核心问题之一,自从Google在20 ... -
大数据处理方面的 7 个开源搜索引擎
2017-09-22 03:01 494大数据是一个包括一切 ... -
开源大数据查询分析引擎现状
2017-09-23 11:26 547大数据查询分析是云计算中核心问题之一,自从Google在2 ... -
elasticsearch 把很多类型都放在一个索引下面 会不会导致查询慢
2017-09-25 09:45 979主要看数据量ES索引优 ... -
腾讯大数据Hermes爱马仕的系统
2017-09-23 11:15 982腾讯大数据最近做了几件事,上线了一个官方网站http:// ... -
配置高性能Elasticsearch集群的9个小贴士
2017-09-25 10:02 589Loggly服务底层的很多 ... -
Elasticsearch与Solr
2017-09-25 16:24 546Elasticsearch简介* Elasti ... -
大数据杂谈微课堂|Elasticsearch 5.0新版本的特性与改进
2017-09-26 09:57 808Elastic将在今年秋季的 ... -
ElasticSearch性能优化策略
2017-09-26 09:51 447ElasticSearch性能优化主 ... -
ES索引优化
2017-09-19 20:39 0ES索引优化篇主要从两个方面解决问题,一是索引数据过程;二是 ... -
分词与索引的关系
2017-09-19 20:33 0分词与索引,是中文搜索里最重要的两个技术,而且两者间是密不可 ... -
Elasticsearch中的segment理解
2017-09-19 20:30 0在Elasticsearch中, 需要搞清楚几个名词,如se ...
相关推荐
而Lucene Collector则是其中一个重要组件,它负责在查询执行过程中收集满足条件的文档,并对这些文档进行进一步处理。本篇文章将深入探讨Lucene Collector的使用以及在分组统计中的应用。 首先,我们要理解Lucene的...
这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...
源代码通常按照模块组织,可能包括新的 Collector 类和其他辅助类,开发者可以通过阅读和学习这些源码来深入理解 Lucene 收集器的工作原理,并根据自己的需求进行定制。 在实际应用中,使用这些扩展的 Lucene 收集...
这一过程涉及到Scorer和Collector,Scorer计算每个文档的相关性分数,而Collector负责收集这些分数并返回结果。 除了基本的搜索功能,Lucene还提供了高级特性,如模糊搜索、短语搜索、近似搜索以及多字段、多语言...
5. **过滤与聚合**:Filter和Collector组件可以用于进一步筛选结果,或者进行分组、统计等聚合操作。 6. **更新与删除**:Lucene支持动态索引更新,可以添加、修改或删除文档,并实时反映在搜索结果中。 7. **多...
Apache Lucene是一个高性能、全文本搜索库,它提供了一个强大的框架来构建自定义的搜索引擎应用。本篇将深入探讨如何利用Java和Lucene来实现一个搜索引擎。 首先,我们要理解Lucene的基本概念。Lucene是一个纯Java...
在 Lucene 中,分组功能并不是内建的,但可以通过自定义 collector 来实现。`GroupCollector` 就是这样一个关键组件,它是实现分组搜索的核心类。`GroupCollector` 负责收集在搜索过程中遇到的文档,并根据指定的...
5. 响应处理:了解HitCollector和Collector的用法,以及如何自定义结果集的处理逻辑。 四、实战开发 在实际项目中,开发者可以利用Lucene.NET 2.9.1源码进行以下操作: 1. 定制Analyzer:根据特定语言或业务需求,...
3. **执行查询**: 使用IndexSearcher的search(Query, Collector)方法,Collector用于收集查询结果。 4. **获取结果**: ScoreDoc数组包含了查询结果的排序信息,可以使用HitQueue或TopDocs来获取前n个最相关的结果。...
`Collector`接口则允许自定义结果收集逻辑,实现如分组、聚合等功能。 8. **高亮显示**:Lucene提供了`Highlighter`类,用于在搜索结果中突出显示匹配的关键词,提高用户体验。 9. **多线程支持**:Lucene 3.0.1...
9. **Collector**: 收集器负责在搜索过程中收集匹配的文档,可以选择性地只收集前N个高分文档,以提高效率。 **2. 提高检索效率** 1. **倒排索引优化**: 倒排索引是Lucene高效检索的基础,通过预处理将文档中的...
8. **Filter和Collector**:Filter用于在搜索结果中进行进一步的筛选,而Collector则用于控制如何收集和处理这些结果。这两个组件允许用户自定义搜索逻辑和结果处理。 9. **分布式搜索**:通过Solr或Elasticsearch...
6. **过滤器(Filter)与收藏集(Collector)**:过滤器可以进一步筛选搜索结果,比如按时间、地理位置或其他条件。收藏集则用于定制搜索结果的收集和处理方式,例如仅收集前N个高分文档。 7. **Highlighter**:...
Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了强大的搜索功能,并且被广泛应用于各种项目中,包括网站站内搜索。本示例提供了使用 Lucene 实现站内搜索的具体步骤和代码示例,帮助开发者...
9. **Collector**: 在搜索过程中收集匹配的文档,可以自定义实现来满足特定需求,如排序、分页等。 10. **Highlighter**: 提供搜索结果的高亮显示。 总的来说,"Lucene5.3.1相关jar包"包含了构建高效全文搜索引擎所...
- **过滤器与集合器**:Filter 类可以用来限制搜索结果,而 Collector 类可以自定义结果收集行为,比如只获取前 N 个结果。 - **多字段搜索**:可以通过设置多个字段查询,使搜索更加灵活。 **总结** Lucene 的...
5. **过滤与聚合**:通过`Filter`和`Collector`可以实现特定条件的筛选和结果聚合。 6. **更新与增量索引**:Lucene支持实时更新,可以仅索引新数据或修改过的数据。 ### 四、实战案例 - **全文检索例子.doc**:...
Lucene 提供了多种扩展点,比如自定义 Analyzer、Filter 和 Collector,以适应不同场景的需求。例如,可以通过自定义 Analyzer 实现更精确的中文分词策略,通过 Filter 进行结果过滤,通过 Collector 实现定制化的...
在“lucene_web”项目中,我们还能看到如何利用Lucene的Filter和Collector来实现特定的搜索需求,例如范围查询、模糊查询、短语查询等。同时,通过ScoreDoc和TopDocs类,我们可以获取到每个文档的排名和总匹配数。 ...
查询执行后,通过Scorer和Collector进行文档评分和收集,决定哪些文档应该返回给用户。 5. **高级特性** Lucene还提供了高级特性,如近似搜索(FuzzySearch)、范围查询(RangeQuery)、通配符查询(WildcardQuery...