Lucene里面Collector

2024-03-18 20:58
文章标签 lucene 里面 collector

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/823630

相关文章

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

运行.bat文件,如何在Dos窗口里面得到该文件的路径

把java代码打包成.jar文件,编写一个.bat文件,执行该文件,编译.jar包;(.bat,.jar放在同一个文件夹下) 运行.bat文件,如何在Dos窗口里面得到该文件的路径,并运行.jar文件: echo 当前盘符:%~d0 echo 当前路径:%cd% echo 当前执行命令行:%0 echo 当前bat文件路径:%~dp0 echo 当前bat文件短路径:%~sdp0 nc

MySQL和Lucene(Elasticsearch)索引对比分析

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据真好玩! 本文是来自略速互联网笔记的分享。 你可以在这里查看原文:http://www.lvesu.com/?uri=/blog/main/cms-611.html 前言 相比于大多数人熟悉的 MySQL 数据库的索引,Elasti

function 报错 Uncaught ReferenceError: fuzzySearch is not defined用$(document).ready(function(){ })里面的

这个情况就有点坑了 ,小胖哥看了都说写法没大问题,后面觉得把 function 函数弄出去的话试下,果然可以了!!!  $(document).ready(function(){ })里面的 function 报错 Uncaught ReferenceError: fuzzySearch is not defined 先来图看看,第一张图跟 第二张图 看起来代码写的很规矩?

kubernetes里面那些事————控制器

资源-控制器 一,控制器作用二,控制器类型2.1,Deployment:无状态应用部署2.2,DaemonSet:确保所有Node运行同一个pod2.3,StatefulSet:有状态应用部署2.4,Job:一次性任务2.5,CronJob:定时任务2.6,pod2.7,service2.8,replicaset2.9,endpoints 三,控制器yaml应用3.1,Deployment3

vben admin里面换行useTable里面的columns

{title: '标题',dataIndex: 'systemName',width: 300, minWidth: 300,customRender: ({ text }: { text: string }) => {return `${text}`;},},     customRender: ({ text }: { text: string }) => {       retu

C#里面的值类型与引用类型的区别

C#里面把数据类型分为两大类,分别为值类型和引用类型,值类型包括基本数据类型(int ,double等),结构和枚举,,,引用类型包括接口,数组,Object类型,类,委托,字符串,null类型等,那这两大类有什么区别呢? 1.值类型:就是一个包含实际数据的量。即当定义一个值类型的变量时,C#会根据它所声明的类型,以栈方式分配一块大小相适应的存储区域给这个变量,随后对这个变量的读或写操作就直接在

HA里面如何添加美的智能设备

环境: Home Assistant 2023.8.0 问题描述: HA里面如何添加美的智能设备 解决方案: 1.打开 HACS 菜单,点开其中的集成选项,点击右下角的“浏览并下载存储库”,之后再搜索 Midea AC LAN 点击下载 如果下载不了要手动下载 将最新版本中的所有 custom_components/midea_ac_lan 文件复制到您的 /custom_compon

java里面怎么读取web.xml里面的context-param值

导包必须要有javax.servlet.ServletContext;     全局初始化参数配置在<wep-app></web-app>内,的格式如下: <wep-app>   <context-param>    <param-name>参数名</param-name>    <param-value>参数值</param-value>   </