【Lucene】详解Lucene全文检索的信息写入与读取

Lucene的大致结构图:

信息写入索引库的过程:

读取信息的过程:

下面是一个向索引库写入信息与读取信息的例子:

public void testCreateIndex() throws Exception{
	/**
	 * 1、创建一个student对象,并且把信息存放进去
	 * 2、调用indexWriter的API把数据存放在索引库中
	 * 3、关闭indexWriter
	 */
	// 创建一个Student对象,并且把信息存放进去
	Student student = new Student();
	student.setId(1L);
	student.setName("张三");
	// 调用indexWriter的API把数据存放在索引库中
	   /**
		* 创建一个IndexWriter
		*    参数三个 1、索引库, 指向索引库的位置  2、分词器
		*/
	// 创建索引库
	Directory directory = FSDirectory.open(new File("./indexDir"));
	// 创建分词器
	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
	IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
	// 把一个student对象转化成document
	Document document = new Document();
	Field idField = new Field("id",student.getId().toString(),Store.YES,Index.NOT_ANALYZED);
	Field nameField = new Field("name",student.getName(),Store.YES,Index.ANALYZED);
	document.add(idField);
	document.add(nameField);
	indexWriter.addDocument(document);
	// 关闭indexWriter
	indexWriter.close();
}
public void testSearchIndex() throws Exception{
	/**
	 * 1、创建一个IndexSearch对象
	 * 2、调用search方法进行检索
	 * 3、输出内容
	 */
	// 创建一个 IndexSearch对象
	Directory directory = FSDirectory.open(new File("./indexDir"));
	IndexSearcher indexSearcher = new IndexSearcher(directory);
	// 调用search方法进行检索
	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
	QueryParser queryParser = new QueryParser(Version.LUCENE_30,"name",analyzer);
	Query query = queryParser.parse("张");  // 要查找的关键词
	TopDocs topDocs = indexSearcher.search(query, 2);  // 前两条
	int count = topDocs.totalHits;  // 根据关键词查询出来的总的记录数
	ScoreDoc[] scoreDocs = topDocs.scoreDocs;
	List<Student> studentList = new ArrayList<Student>();
	for(ScoreDoc scoreDoc:scoreDocs){
		float score = scoreDoc.score;  // 关键词得分
		int index = scoreDoc.doc;  // 索引的下标
		Document document = indexSearcher.doc(index);
		// 把document转化成Student
		Student student = new  Student();
		student.setId(Long.parseLong(document.get("id")));  // document.getField("id").stringValue()
		student.setTitle(document.get("name"));
		studentList.add(student);
	}

	for(Student student:studentList){
		System.out.println(student.getId());
		System.out.println(student.getName());
	}
}

说明:

1、索引库的增、删、改是由indexWriter来操作的

2、同一个时刻内,同一个索引库,只能允许一个indexWriter操作

3、当IndexWriter创建完成以后,indexwriter所指向的索引库就被占领了,只有当indexWriter.close时,才能释放锁的资源

4、当一个新的indexWriter想拥有索引库时,原来的indexWriter必须释放锁

5、只要索引库中存在write.lock文件,说明上锁了

6、indexWriter.close有两层含义:1. 关闭IO资源; 2.释放锁

文件索引库和内存索引库的结合 :

1、能不能设置很多个索引库

可以设置很多个索引库

2、索引库能不能合并起来

如果是内存索引库

Directory ramDirectory = new RamDirectory(Directory d);

这样就可以把一个索引库放入到内存索引库中

利用IndexWriter.addIndexesNoOptimize方法可以把很多个索引库进行合并操作

3、应用程序能不能在内存中和索引库进行交互

Author:顾故

Sign:别输给曾经的自己

时间: 2024-10-12 19:18:29

【Lucene】详解Lucene全文检索的信息写入与读取的相关文章

Lucene详解

一.lucene原理 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索.比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将

ajax异步参数详解及alax错误信息error分析

一.$.ajax()的参数列表 ↑ 下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持. timeout Number 设置请求超时时间(毫秒).

数据库 查询方法详解 以学生老师信息表为例

create table Student--3rd再次执行 ( Sno int primary key not null,--学号主键 Sname varchar(50) not null,--学生姓名 Ssex varchar(50) not null,--学生性别 Sbirthday datetime,--出生年月 Class int--班级 ) truncate table Student--清空表格 insert into Student values(108,'曾华','男','197

linux dmesg命令参数及用法详解(linux显示开机信息命令)

功能说明:显示开机信息. 语 法:dmesg [-cn][-s <缓冲区大小>] 补充说明:kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息亦保存在/var/log目录中,名称为dmesg的文件里. 参 数: -c  显示信息后,清除ring buffer中的内容.  -s<缓冲区大小>  预设置为8196,刚好等于ring buffer的大小.  -n  设置记录信息的层级. 扩展阅读一:dmesg命令主要用途

CentOS 5,6 系统启动流程详解

一.linux 组成介绍 1.linux 组成: Linux: kernel+rootfs(根文件系统) kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs: 程序和glibc 库:函数集合, function, 调用接口(头文件负责描述) 过程调用: procedure,无返回值 函数调用: function 程序:二进制执行文件 2.内核设计流派: 单内核(monolithic kernel): Linux 把所有功能集成于同一个程序 微内核(micro

adb调试命令详解-2016.02.01

adb(Android Debug Bridge),调试桥可以让设备的调试监测过程在远端进行,而不必在运行实际运行应用的设备上,方便调试的输出. 1 命令详解 a 查看帮助信息         adb --help 选项参数: adb [-d|-e|-s <serialNumber>] <command> -a 对于adb建立连接,将监听在所有的网卡上 -d 只对于USB连接的设备执行命令,如果有多个设备使用USB连接,将返回失败. -e 只对正在运行的模拟器执行命令,如果有多个模

基础拾遗------webservice详解

基础拾遗 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗------接口详解 基础拾遗------泛型详解 前言 工作当中常用的服务接口有三个wcf,webservice和webapi.首先第一个接触的就是webservice,今天大致总结一下. 1.webservice概念相关 1.1.Web Service也叫XML Web Service WebService 是一种可以接收从Inter

Linux文件管理命令详解及练习

Windows里对于文件的管理比较直观,但Linux呢?如何在Linux系统里创建.复制.移动.删除文件与目录呢?这其实是个问题,但随着学习的进行,这将不再是个问题:一:文件管理类命令名称?命令的归纳:1.创建文件:? touch? ? ? ? ? ? ? ? ? ? ? ? ? 2.查看文件属性:ls? ? ? ? ? ? ? ? ? ? ? ? ? 3.查看文件内容:cat.tac.more.less.head.tail? ? ? ? ? ? ? ? ? ? ? ? ? 4.复制文件.目录:

scandir函数详解

scandir函数详解2009-10-30 10:51scandir函数:读取特定的目录数据表头文件:#include <dirent.h>定义函数:int scandir(const char *dir, struct dirent **namelist, nt (*select) (const struct dirent *), nt                     (*compar) (const struct dirent **, const struct dirent**))