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的类LuceneIndexWriter 
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操作时,会生成如图所看到的的结构:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmVyb21lX3M=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


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

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

手动合并文件

合并多个小文件为一个大文件,降低IO操作:

在indexWriter.close();前加上

indexWriter.optimize();

就可以
在运行完上述代码后,索引库的结构为:
能够看出把该合并的项都合并了。把del文件彻底所有删除掉了。


自己主动合并文件

indexWriter.setMergeFactor(3);



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

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


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

  1. Lucene第二篇【抽取工具类、索引库优化、分词器、高亮、摘要、排序、多条件搜索】

    对Lucene代码优化 我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的: 以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了.是重复代码! Directory dire ...

  2. MySQL引擎、索引和优化(li)

    一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术 ...

  3. 使用solrj操作solr索引库

    (solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...

  4. 使用solrj操作solr索引库,solr是lucene服务器

    客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...

  5. JAVAEE——Solr:安装及配置、后台管理索引库、 使用SolrJ管理索引库、仿京东的电商搜索案例实现

    1 学习回顾 1. Lucene  是Apache开源的全文检索的工具包 创建索引 查询索引 2. 遇到问题? 文件名 及文件内容  顺序扫描法  全文检索 3. 什么是全文检索? 这种先创建索引 再 ...

  6. JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理

    1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...

  7. 配置好solr搜索引擎服务器后java后台如何将商品信息导入索引库

    首先,在配置文件目录中添加solr 服务器的bean 配置文件 solr服务器的url可以写在配置文件中: url地址其实就是我们网页可以访问的solr地址: 然后我们写 service packag ...

  8. Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)

    Elasticsearch之重要核心概念如下: 1.cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是 ...

  9. Python—一个简单搜索引擎索引库

    因为课业要求,搭建一个简单的搜索引擎,找了一些相关资料并进行了部分优化(坑有点多) 一.数据 数据是网络上爬取的旅游相关的攻略页面 这个是travels表,在索引中主要用到id和url两个字段. 页面 ...

随机推荐

  1. Ui篇--layout_weight体验(实现按比例显示)

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

  2. 关于ThinkPHP中Session不能夸模块/控制器使用的问题-网上的答案我做个补充

    1,确保c:/windows目录下有php.ini文件2,修改php.ini中的session.auto_start = 0 为 session.auto_start = 1  //设置自动开启ses ...

  3. [Irving]WPF Invalid character in the given encoding. Line xx, position xx.' XML is not valid.

    WPF开发中发现Xaml界面中突然抽风似的提示错误 Invalid character in the given encoding. Line xx, position xx.' XML is not ...

  4. ldconfig报错 :libstdc++.so.6.0.18-gdb.py不是一个elf文件

    今天安装wxWidgets,输入ldconfig竟然提示 /usr/lib64/libstdc++.so.6.0.18-gdb.py 不是一个elf文件,开头魔数错误 摸不着头脑,上网搜了一下,有说是 ...

  5. Java Client for Google Cloud Storage

    关于Google Cloud Storage Google Cloud Storage有益于大文件的存储与服务(serve).此外,Cloud Storage提供了对访问控制列表(ACLs)的使用,提 ...

  6. 【转】iPhone 6 屏幕揭秘

    http://www.cocoachina.com/design/20141218/10680.html 一根线的渲染 为了说明多种设备的不同像素渲染情况,我们比较了一个一像素宽的线是怎样渲染的: 最 ...

  7. mysql查询数据库大小和表

    每个mysql都有一个库information_schema,里面有一张表TABLES存储了所有数据库表的信息,因此,可以从这张表中查看数据库大小和表大小 查询数据库大小 ,),'GB') as da ...

  8. poj 1915 http://poj.org/problem?id=1915

    /**< */#include <stdio.h> #include <string.h> #include <stdlib.h> #include < ...

  9. Linux 系统监控和诊断工具:lsof

    1.lsof 简介 lsof 是 Linux 下的一个非常实用的系统级的监控.诊断工具. 它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~ 它可以用来列出被 ...

  10. UVaLive 6862 Triples (数学+分类讨论)

    题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...