-
在上一篇HelloWorld的基础上,建立一个directory的包,添加一个DirectoryTest的测试类,用来根据指定的索引目录创建目录存放指引.
DirectoryTest类中的代码如下,基本上就是在HelloWorld的基础上改改就可以了.
里面一共三个方法,testDirectory(),测试创建索引库;testDirectoryFSAndRAM(),结合方法1的两种创建方式,优化;testDirectoryOptimize(),在方法2个基础上,研究索引的优化创建,减少创建的索引文件数.
01.
package
com.lucene.directory;
02.
03.
import
org.apache.lucene.analysis.Analyzer;
04.
import
org.apache.lucene.analysis.standard.StandardAnalyzer;
05.
import
org.apache.lucene.document.Document;
06.
import
org.apache.lucene.index.IndexWriter;
07.
import
org.apache.lucene.index.IndexWriter.MaxFieldLength;
08.
import
org.apache.lucene.store.Directory;
09.
import
org.apache.lucene.store.FSDirectory;
10.
import
org.apache.lucene.store.RAMDirectory;
11.
import
org.junit.Test;
12.
13.
import
com.lucene.units.File2DocumentUtils;
14.
15.
/**
16.
* 创建索引库
17.
* @author liu
18.
*
19.
*/
20.
public
class
DirectoryTest {
21.
22.
// 需要查询的文件所在的路径
23.
String filePath =
"F:\\Users\\liuyanling\\workspace\\LuceneDemo\\datasource\\peoplewhocannot.txt"
;
24.
// 设置索引存放的路径
25.
String indexPath =
"F:\\Users\\liuyanling\\workspace\\LuceneDemo\\luceneIndex"
;
26.
// 设置分词器为标准分词器
27.
Analyzer analyzer =
new
StandardAnalyzer();
28.
29.
/**
30.
* 测试,自动建立索引库
31.
* @throws Exception 抛出异常
32.
*/
33.
@Test
34.
public
void
testDirectory()
throws
Exception {
35.
//将索引生成到文件系统中(优点:数据永久保存;缺点:操作速度慢)
36.
Directory dir = FSDirectory.getDirectory(indexPath);
37.
38.
/*//将索引生成到内存中(优点:速度快,缺点:程序关闭,数据清除)
39.
Directory dir = new RAMDirectory();*/
40.
41.
//所以可以结合:1.生成的时候,生成到内存中;2.关闭的时候,保存起来.(参看下面的方法testDirectoryFSAndRAM)
42.
43.
Document doc = File2DocumentUtils.file2Document(filePath);
44.
IndexWriter indexWriter =
new
IndexWriter(dir, analyzer,
true
,MaxFieldLength.LIMITED);
45.
indexWriter.addDocument(doc);
46.
47.
indexWriter.close();
48.
}
49.
50.
/**
51.
* 测试,启动时读取内存中,退出时保存
52.
* @throws Exception 抛出异常
53.
*/
54.
@Test
55.
public
void
testDirectoryFSAndRAM()
throws
Exception {
56.
//创建文件系统的索引库
57.
Directory fsDir = FSDirectory.getDirectory(indexPath);
58.
59.
//1.启动时读取
60.
//构造内存的索引库
61.
Directory ramDir =
new
RAMDirectory(fsDir);
62.
//运行程序时操作ramDir,构造操作内存索引库的索引器
63.
IndexWriter ramIndexWriter =
new
IndexWriter(ramDir,analyzer,MaxFieldLength.LIMITED);
64.
//添加文档Document,将文档创建索引到内存索引库
65.
Document doc = File2DocumentUtils.file2Document(filePath);
66.
ramIndexWriter.addDocument(doc);
67.
ramIndexWriter.close();
68.
69.
//2.退出时保存
70.
//构造文件系统的索引器,true表示要重写指定的存放索引目录下的索引文件,false则表示在指定存放索引目录下已经存在的索引文件的基础上,向其中继续追加新的索引文件。
71.
IndexWriter fsIndexWriter =
new
IndexWriter(fsDir,analyzer,
true
,MaxFieldLength.LIMITED);
72.
//不进行优化的添加索引,将内存中的索引库添加到文件系统中
73.
fsIndexWriter.addIndexesNoOptimize(
new
Directory[] {ramDir});
74.
75.
//fsIndexWriter.flush();
76.
//fsIndexWriter.optimize();
77.
78.
fsIndexWriter.close();
79.
}
80.
81.
/**
82.
* 索引生成,优化,合并索引文件,减少生成索引文件数
83.
* @throws Exception
84.
*/
85.
@Test
86.
public
void
testDirectoryOptimize()
throws
Exception {
87.
//创建文件系统的索引库
88.
Directory fsDir = FSDirectory.getDirectory(indexPath);
89.
//构造索引器
90.
IndexWriter fsIndexWriter =
new
IndexWriter(fsDir,analyzer,MaxFieldLength.LIMITED);
91.
//使用索引器,优化的生成索引
92.
fsIndexWriter.optimize();
93.
fsIndexWriter.close();
94.
}
95.
96.
}
查看运行效果,
1.先测试testDirectory()的Directory dir =FSDirectory.getDirectory(indexPath); 为体现效果,先删除现有的索引文件.
测试成功之后
刷新项目,就可以看到新建好的索引.
2.再测试testDirectory()的Directory dir = new RAMDirectory();,还是删除索引文件,执行单元测试,成功,但是并没有在文件系统中生成可以看到的索引库。但是可以比较下,两种方法执行的时间,很明显的,在内存中创建速度相当快.
3.由于在将索引生成到文件系统中(优点:数据永久保存;缺点:操作速度慢),而将索引生成到内存中(优点:速度快,缺点:程序关闭,数据清除),所以两者结合的testDirectoryFSAndRAM方法,先看下效果,因为没有索引文件,也不用删除.
运行成功,时间比只用内存索引库和文件系统索引库都要长,但是这只是将一个Document文件创建成索引,如果是多个,那么该方法是会提高效率的.
并且可以看到索引库也生成了。
4.现在为了执行优化的创建索引testDirectoryOptimize,先多创建几条索引。现在用testDirectoryFSAndRAM创建了4条索引了。
执行HelloWorld的search方法,可以看出是4条。
接着执行优化方法
索引文件由原来的4条8k的记录,变为1条24k的记录.从结果上看,一是体积减少;2是文件变少.
5.现在知道了,先创建内存索引器来操作文档,结束时保存,在文件多的时候可以起到优化的作用,而optimize方法可以减少索引的文件,以及体积,两个结合,可以生成优化的索引.其中,fsIndexWriter.flush();已经过时,把这句注了,运行也是成功的,效果也是有的.
1.
//不进行优化的添加索引,将内存中的索引库添加到文件系统中
2.
fsIndexWriter.addIndexesNoOptimize(
new
Directory[] {ramDir});
3.
4.
//fsIndexWriter.flush();
5.
fsIndexWriter.optimize();
以上就是lucene的创建索引库.指定索引位置,先在内存中创建索引,然后保存到文件系统中,同时可以进行优化,合并索引文件.下一篇是对于分词器,采用多种分词器,查看他们的分词效果,《全文检索之lucene的优化篇--分词器》
全文检索之lucene的优化篇 建索引库
最新推荐文章于 2023-05-29 02:03:01 发布