lucene_indexWriter说明、索引库优化

IndexWriter

Hibernate的SessionFactory

在Hibernate中,一般保持一个数据库就只有一个SessionFactory。因为在SessionFactory中维护二级缓存,而SessionFactory又是线程安全的。所以SessionFactory是共享的。

lucene的IndexWriter

如果同时在一个索引库中同时建立两个IndexWriter,例如:

		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		IndexWriter indexWriter2 = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);

这样的代码会出现异常

而lucene的目录结构:

.会出现write.lock这个文件。因为当一个IndexWriter在进行读索引库操作的时候,lucene会为索引库,以防止其他IndexWriter访问索引库而导致数据不一致,直到IndexWriter关闭为止。

结论:同一个索引库只能有一个IndexWriter进行操作。

封装IndexWriter的类LuceneUtils

public class LuceneIndexWriter {
	private static IndexWriter indexWriter = null;

	public static IndexWriter getIndexWriter() {
		if (indexWriter == null) {
			try {
				indexWriter = new IndexWriter(LuceneUtils.directory,
						LuceneUtils.analyzer, MaxFieldLength.LIMITED);
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return indexWriter;
	}

	public static void close() {
		if (indexWriter != null) {
			try {
				indexWriter.close();
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("indexWriter为空,不能关闭!");
		}
	}
}

注:这里用单例模式做比较好。

/**
 * 1、索引库的增、删、改是由indexWriter来操作的
 * 2、同一个时刻内,同一个索引库,只能允许一个indexWriter操作
 * 3、当IndexWriter创建完成以后,indexwriter所指向的索引库就被占领了,只有当indexWriter.close时,才能释放锁的资源
 * 4、当一个新的indexWriter想拥有索引库时,原来的indexWriter必须释放锁
 * 5、只要索引库中存在write.lock文件,说明上锁了
 * 6、indexWriter.close有两层含义:
 *     *  关闭IO资源
 *     *  释放锁
 * @author Administrator
 *
 */
public class IndexWriterTest {
	@Test
	public void testIndexWriter() throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		indexWriter.close();
		IndexWriter indexWriter2 = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
	}
}

索引库的优化

当执行创建索引多次时,索引库的文件如图所示:(索引里内容是一样的)

从图中可以看出来,每执行一次就生成一个cfs文件。当执行delete操作时,会生成如图所示的结构:

从图中可以看出来,lucene在执行删除的时候,是先把要删除的元素形成了一个文件del文件,然后再和cfs文件进行整合得出最后结果。

结论:如果增加、删除反复操作很多次,就会造成文件大量增加,这样检索的速度也会下降,所以我们有必要去优化索引结构。使文件的结构发生改变从而提高效率。

手动合并文件

合并多个小文件为一个大文件,减少IO操作:

在indexWriter.close();前加上

indexWriter.optimize();

即可

在执行完上述代码后,索引库的结构为:

可以看出把该合并的项都合并了。把del文件彻底全部删除掉了。

自动合并文件

indexWriter.setMergeFactor(3);

当cfs文件的数量为3个时,这是会自动合并成一个文件。

如果没有设置数量,默认情况下为10;

lucene_indexWriter说明、索引库优化

时间: 2024-08-14 00:03:24

lucene_indexWriter说明、索引库优化的相关文章

Lucene系列:(5)LuceneUtils之索引库优化

1.什么是索引库 索引库是Lucene的重要的存储结构,它包括二部份:原始记录表,词汇表 原始记录表:存放的是原始记录信息,Lucene为存入的内容分配一个唯一的编号 词汇表:存放的是经过分词器拆分出来的词汇和该词汇在原始记录表中的编号 2.为什么要将索引库进行优化 在默认情况下,向索引库中增加一个Document对象时,索引库自动会添加一个扩展名叫*.cfs的二进制压缩文件,如果向索引库中存Document对象过多,那么*.cfs也会不断增加,同时索引库的容量也会不断增加,影响索引库的大小.

全文检索之lucene的优化篇--创建索引库

在上一篇HelloWorld的基础上,建立一个directory的包,添加一个DirectoryTest的测试类,用来根据指定的索引目录创建目录存放指引. DirectoryTest类中的代码如下,基本上就是在HelloWorld的基础上改改就可以了. 里面一共三个方法,testDirectory(),测试创建索引库;testDirectoryFSAndRAM(),结合方法1的两种创建方式,优化;testDirectoryOptimize(),在方法2个基础上,研究索引的优化创建,减少创建的索引

搜索引擎分词与索引库

分词是很多做SEO的人常听到的概念,为了让大家在这个方面不会有疑惑,现在要来讲一下分词以及索引库.这也是更深入的了解搜索引擎的开始. 搜索引擎每天都是在处理一个基本的需求:用户搜索一个关键词,搜索引擎马上找到相关的网页给用户.这个过程要怎么实现呢? 下面就分步来了解这个过程. 首先搜索引擎要尽可能多的把互联网上的网页搜集下来,这样能提供大量的网页给用户查询.这一部分由爬虫来解决,顺着互联网上的链接一个个往下抓取.最后 就有了一堆记录着网页各种信息的资料库.目前的现状,最后能使这个资料库里有大概1

MySQL引擎、索引和优化(Ali)

一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能.InnoDB存储引擎是5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定.另外还有常见的MyISAM存储引擎,它拥有较高的插入,查询速度,但不支持事务.所以,很明显:插入不频繁,查询非常频繁,没有事务

solr4使用solrj操作索引库

solr配套有好多的客户端用于操作索引库,下面我们来讲如何用solrj去操作solr索引库. 一.认识solrj solrj是solr的java客户端,用于访问solr索引库.它提供了添加.删除.查询.优化等功能. 二.下载 百度.google以下solrj下载,你会发现根本就没有,那么我们该到哪儿下载呢?其实,它是集成到solr压缩包里的,解压文件后,有个目录/dist/solrj-lib,里面就存放了solrj所用到的jar,你把这些jar都添加到你的classpath就ok. 如果你是使用

使用solrj操作solr索引库

(solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有那么麻烦,solr配套有好多的客户端用于操作索引库,下面我们来讲如何用solrj去操作solr索引库. 一.认识solrj solrj是solr的java客户端,用于访问solr索引库.它提供了添加.删除.查询.优化等功能. 二.下载 百度.google以下solrj下载,你会发现根本就没有,那么我们该到哪儿

solr的索引库core相关配置解析

1.core的概念 2.目录结构 conf目录中有两个非常重要的配置文件:schema.xml和solrconfig.xml 3.配置详解 core.properties schemal.xml solrconfig.xml 3.1 core.properties Core的属性文件,记录当前core的名称.索引位置.配置文件名称等信息,也可以不写.主要用于修改名字 3.2 schema.xml Solr中会提前对文档中的字段进行定义,并且在schema.xml中对这些字段的属性进行约束,例如:

oracle数据性能库优化方案精髓整理收集回顾

oracle数据库性能优化总体法则: 一.减少数据访问(减少硬盘房访问次数) 二.返回更少的数据(减少网络传输或磁盘访问) 三.减少交互次数(减少网络传输) 四.减少服务器开销(减少cpu及内存开销) 五.利用更多的资源(增加资源) ===================具体说明================= 一.减少数据访问(减少硬盘房访问次数) 1.减少数据访问 1.1.创建并使用正确的索引 索引会大大增加DML(增删改)的开销[合理的索引会大大提高效率100倍.1000倍,但不合理的索

Lucene建立索引库

问题?Lucene如何建立索引库,lucene所需要的jar包是那些  , lucene如何使用索引库,lucene的核心原理 一.Lucene是什么? 全文检索只是一个概念,而具体实现有很多框架,lucene是其中的一种方式.本文将以lucene3.0进行开发 官兵与Luncne的jar包可以去官网下载:点击打开链接,不过好像Lucene已经更新到6.1了. 二.建立索引库 1.互联网搜索全文搜索引擎结构图: 2.Lucene的结构图: 说明: (1)在数据库中,数据库中的数据文件存储在磁盘上