【Lucene4.8教程之三】搜索

1、关键类

Lucene的搜索过程中涉及的主要类有以下几个:

(1)IndexSearcher:执行search()方法的类

(2)IndexReader:对索引文件进行读操作,并为IndexSearcher提供搜索接口

(3)Query及其子类:查询对象,search()方法的重要参数

(4)QueryParser:根据用户输入的搜索词汇生成Query对象。

(5)TopDocs:search()方法返回的前n个文档

(6)ScoreDocs:提供TopDocs中搜索结果的访问接口

2、搜索的关键步骤

(1)创建IndexReader

(2)使用IndexReader创建IndexSearcher

(3)根据搜索关键字,使用QueryParser生成Query对象

(4)以Query作为参数调用IndexSearcher.search(),执行搜索

(5)以TopDocs以及ScoreDocs遍历结果并处理

示例代码如下:

//(1)创建IndexReader
Directory indexDir2 = FSDirectory.open(indexDir);
IndexReader ir = DirectoryReader.open(indexDir2);
//(2)使用IndexReader创建IndexSearcher
IndexSearcher searcher = new IndexSearcher(ir);
//(3)根据搜索关键字,使用QueryParser生成Query对象
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48));
Query query = null;
try {
	query = parser.parse(term);
	} catch (ParseException e) {
		e.printStackTrace();
	}
//(4)以Query作为参数调用IndexSearcher.search(),执行搜索
TopDocs docs = searcher.search(query, 30);		

//(5)以TopDocs以及ScoreDocs遍历结果并处理
ScoreDoc[] hits = docs.scoreDocs;
System.out.println(hits.length);
for (ScoreDoc hit : hits) {
			System.out.println("doc: " + hit.doc + " score: " + hit.score);
		}

3、关于IndexReader

(1)IndexReader未提供构造函数,因此需要通过DirectoryReader.open()方法来创建一个IndexReader。

(2)创建一个IndexReader需要较大的系统开销,因此最好在所有搜索期间都重复使用一个IndexReader,只有在必要的时候才建议打开新的IndexReader。

(3)在创建IndexReader时,它会搜索已有的索引快照,如果你需要搜索索引中的变更信息,那么必须打开一个新的reader。所幸的是IndexReader.reopen方法是一个获取新IndexReader的有效方法,能在耗费较少系统资源的情况下使用当前reader来获取索引中所有的变更信息。【新版本中已废弃,待确认替代方法】

【Lucene4.8教程之三】搜索,布布扣,bubuko.com

时间: 2024-10-08 20:12:14

【Lucene4.8教程之三】搜索的相关文章

【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象

对于一个搜索而言,其核心语句为: searcher.search(query, 10); 此时,其最重要的参数为一个Qeury对象.构造一个Query对象有2种方法:[均以在contents域搜索java关键词为例] (1)使用Query的子类,如BooleanQuery, ConstantScoreQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, Phr

【Lucene4.8教程之四】分析

1.基础内容 (1)相关概念 分析(Analysis),在Lucene中指的是将域(Field)文本转换成最基本的索引表示单元--项(Term)的过程.在搜索过程中,这些项用于决定什么样的文档能够匹配查词条件. 分析器对分析操作进行了封装,它通过执行若干操作,将文本转化成语汇单元,这个处理过程也称为语汇单元化过程(tokenization),而从文本洲中提取的文本块称为语汇单元(token).词汇单元与它的域名结合后,就形成了项. (2)何时使用分析器 建立索引期间 Directory retu

【Lucene4.8教程之二】索引

一.基础内容 0.官方文档说明 (1)org.apache.lucene.index provides two primary classes: IndexWriter, which creates and adds documents to indices; and IndexReader, which accesses the data in the index. (2)涉及的两个主要包有: org.apache.lucene.index:Code to maintain and acces

【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会造成内存泄露.而且用起来超级麻烦,我们往往在debug的时候,很大一部分时间在纠结手动释放内存的问题.虽然对于小型的程序来说手动管理内存不是问题,但一旦我们写的代码变得越来越庞大,我们便会开始越来越多地纠缠于内存管理的问题,而不是着力解决你的开发目标. 这,就有些舍本逐末的感觉了. 而自从OpenCV踏入2.0时代,用Mat

[MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

>目录< >----------------------< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows Sockts 4.使用静态链接库 [方便一会直接生成的exe文件单独可以发布] 2. 搭建界面  1. 拖入控件: 2. 控件拖入并摆好 3. 控件属性设置: 3. 写代码实现功能  1.变量绑定: 2.加入图片资源 3.新建mp3类: 4.修改Tao_MusicDlg.h 5.修改Tao_Music.cpp 6

【Lucene4.8教程之二】域(Field)的用法

1.在Lucene4.x前,使用以下方式创建一个Field: Field field = new Field("filename", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED); Field field = new Field("contents", new FileReader(f)); Field field = new Field("fullpath", f.getCano

SpringCloud 教程 之三 服务消费(Feign)

1.启动服务注册应用 可参考 SpringCloud 教程 之一 服务注册与服务发现(Eureka) 创建 springcloud-eureka-server 服务注册工程,并启动 2.启动服务提供者应用 可参考 SpringCloud 教程 之二 服务消费(Ribbon) 创建 springcloud-eureka-provider 服务提供者工程,并启动 3.创建服务消费工程 3.1.新建 Spring Boot 工程 springcloud-eureka-feign 3.2.工程pom.x

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的插图显示页面当你完成时的样子.列标题是链接,用户可以单击要作为排序依据的列.单击列标题,一再升序和降序之间切换. 将列排序链接添加到学生索引页 若要添加排序到学生索引页,会改变Student控制器的Index方法,将代码添加到Student的索引视图. 添加排序功能指数法 在Controllers\

【REACT NATIVE 系列教程之三】函数绑定与FLEXBOX是用好REACT的基础

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2222.html Himi在写React 时主要遇到两个知识点觉得很有必要跟大家一起回顾下. 函数绑定 FlexBox 布局 一:函数绑定 首先来看一段代码片段: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 constructor(props) { super(props