Hello,欢迎来到程序员社区。 今天聊一聊 Lucene索引库的优化,希望对大家有所帮助。
Java面试手册PDF下载:http://117.78.51.75/219-2
当执行创建索引多次时,索引库的文件如图所示:(索引里内容是一样的)
从图中可以看出来,每执行一次就生成一个cfs文件。当执行delete操作时,会生成如图所示的结构:
从图中可以看出来,lucene在执行删除的时候,是先把要删除的元素形成了一个文件del文件,然后再和cfs文件进行整合得出最后结果。
结论:如果增加、删除反复操作很多次,就会造成文件大量增加,这样检索的速度也会下降,所以我们有必要去优化索引结构。使文件的结构发生改变从而提高效率。
手动合并文件
在执行完上述代码后,索引库的结构为:
可以看出把该合并的项都合并了。把del文件彻底全部删除掉了。
自动合并文件
LuceneUtils.getIndexWriter().setMergeFactor(3)意思为当文件的个数达到3的时候,合并成一个文件。如果没有设置这个值,则使用默认的情况:10
执行三次之后的目录文件:
可以看到已经合并了。
内存索引库
特点
在内存中开辟一块空间,专门为索引库存放。这样有以下几个特征:
1) 因为索引库在内存中,所以访问速度更快。
2) 在程序退出时,索引库中的文Java面试手册件也相应的消失了。
3) 如果索引库比较大,必须得保证足够多的内存空间。
编码
在执行完这段代码以后,并没有在磁盘上出现索引库。所以单独使用内存索引库没有任何意义。
文件索引库与内存索引库的结合
当应用程序启动的时候,从文件索引库加载文件到内存索引库。应用程序直接与内存索引库交互。当应用程序退出的时候,内存索引库把数据再次保存到文件索引库,完成文件的保存工作。
/**
* 文件索引库和内存编程电子书汇总索引库的结合
*/
@Test
public void testRamAndFile() throws Exception{
/**
* 1、当应用程序启动的时候,把文件索引库的内容复制到内存库中
* 2、让内存索引库和应用程序交互
* 3、把内存索引库的内容同步到文件索引库
*/
Directory fileDirectory = FSDirectory.open(new File("./indexDir"));
Directory ramDirectory = new RAMDirectory(fileDirectory);
IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
IndexWriter fileIndexWriter = new IndexWriter(fileDirectory,LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);
/**
* 在内存索引库中根据关键词查询
*/
this.showData(ramDirectory);
System.out.println("上面的是从内存索引库中查询出来的");
/**
* 把一条信息插入到内存索引库
*/
Article article = new Article();
编程电子书汇总 article.setId(1L);
article.setTitle("lucene可以做搜索引擎");
article.setCJava面试手册ontent("baidu,google都是很好的搜索引擎");
ramIndexWriter.addDocument(DocumentUtils.article2Document(article));
ramIndexWriter.close();
/*
编程电子书汇总 * 把内存索引库中的内容同步到文件索引库中
*/
fileIndexWriter.addIndexesNoOptimize(ramDirectory);
fileIndexWriter.close();
this.showData(fileDirectory);
System.out.println("上面的是从文件索引库中查询出来的");
}
说明:
1) Directory ramdirectory = new RAMDirectory(filedirectory);把filedirectory这个索引库加载到ramdirectory内存库中
2) IndexWriter的构造函数:
True 重新创建一个或者覆盖(选择)
False 追加
时间不一定能证明很多东西,但是一定能看透很多东西。坚信自己的选择,不动摇,使劲跑,明天会更好。