Lucene索引库的优化

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

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

从图中可以看出来,lucene在执行删除的时候,是先把要删除的元素形成了一个文件del文件,然后再和cfs文件进行整合得出最后结果。
结论:如果增加、删除反复操作很多次,就会造成文件大量增加,这样检索的速度也会下降,所以我们有必要去优化索引结构。使文件的结构发生改变从而提高效率。

手动合并文件

这里写图片描述
在执行完上述代码后,索引库的结构为:
这里写图片描述
可以看出把该合并的项都合并了。把del文件彻底全部删除掉了。

自动合并文件

这里写图片描述
LuceneUtils.getIndexWriter().setMergeFactor(3)意思为当文件的个数达到3的时候,合并成一个文件。如果没有设置这个值,则使用默认的情况:10

执行三次之后的目录文件:
这里写图片描述

可以看到已经合并了。

内存索引库

特点

在内存中开辟一块空间,专门为索引库存放。这样有以下几个特征:
1) 因为索引库在内存中,所以访问速度更快。
2) 在程序退出时,索引库中的文件也相应的消失了。
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.setContent("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 追加

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值