2007-7-4
声明:这只是我的学习笔记,有很多理解不对的地方,发在这里主要是想请大家帮忙看看我的理解有啥不对的地方,不能作为教程看啊…………
创建索引
前面已经创建了Document和Field,那么如何存储创建好的索引呢?这是通过IndexWriter实现的。
IndexWriter在创建的时候需要指定索引文件所在目录参数、分析器参数(用来在进行索引的时候对文本进行分析,用来进行将索引字段进行切词的操作)、是否重新创建索引操作(如果为true,则清空重建,false则是增加在其基础上增加索引)
同时向一个目录下进行索引写操作时,只能由一个IndexWriter进行操作,如果多个IndexWriter会造成同步问题。
注意这里说的是同一个
IndexWriter
,也就是说多个线程操作揖个
IndexWriter
的写入方法是可以的喽??
接下来讲的例子给出了创建索引的过程。最重要的是不要忘了在结束的时候调用close()函数,只有调用了此函数之后,才会将存放于内存中的数据保存到硬盘上。
看列出的IndexWriter源代码,在addDocument()方法中使用了synchronized防止了多线程同时访问的问题。
性能的调整:
在将索引数据写入磁盘的时候,可以通过三个参数对性能进行优化:
在进行之前需要说的一个概念就是Segment,他是索引文件中最大的一个单位。它是有多个Document(或者Segment)合并起来的。具体格式后面会讲到
1
mergeFactor
:这个参数设置了写入磁盘时内存中最大的
Document
数量,用来设置多少个
Document
对象可以被预先缓存在内存中,然后将它们一起写入磁盘,默认值为
10
个;
举例说明:假设设置为
10
,每当
10
个
Document
被添加入索引后,将创建一个段(segment<长度为10>
);每当凑齐了长度为
10
的
10
个段时,则会创建整合成一新的段(长度为
100
),依此类推
所以,较高的
mergeFactor
值会占用较多的内存,但会在写入时减少对磁盘的访问。通常会加速创建索引的过程,较高的
mergeFactor
会导致查询速度变慢,因为查询时会从一个较大的索引文件中读取。
2
maxMergeDocs
:
定义了一个段中最大的
Document
数量,以防止单个
Segment
无限扩充下去。
较高的
maxMergeDocs
适合于批量索引,适合于新创建索引。创建索引的速度快,但占用的内存比较多;较小的值适合于增量式增加索引。
3
minMergeDocs
:控制了存储到一个段前,被缓存的
Document
的数量,这将影响到段在磁盘上的大小,此参数也会改善索引的速度,但是过大会导致内存溢出
这块有点晕,好像两本书讲的不大一样,也可能是俺英文差,没看懂。好像这三参数只是用来在创建索引的时候用。但是这几个参数设置了之后创建出的索引文件是一样的吗?检索效率一样吗?这里需要重看看以后,估计有问题。