Lucene中IndexSearcher的构造函数有以下几个:



























由此可知,可以用索引文件的存储路径path、文件对象file、索引对象(即IndexReader对象)reader初始化IndexSearcher对象,从上边的代码可以看到前两个构造函数的参数(path或directory)都转换为索引对象,同时多了一个boolean类型的参数closeReader,那么这个增加的参数的作用是什么呢?那么我们可以在IndexSearcher类中搜索,可以看到:













可以看到注释中写到:注意,如果IndexSearcher对象由IndexSearcher(IndexReaderr)初始化,下边的索引(IndexReader)对象不关闭。若如果索引(IndexReader)对象由一个指定的路径暗中生成,那么IndexReader对象将关闭。
索引(IndexReader)对象在搜索之前就已定义,这个索引对象不属于IndexSearcher对象,索引(IndexReader)对象就不能关闭。
在lucene应用中也许很多人都遇到这种情况。当索引太大(大于10G),搜索时用前两种构造方法声明IndexSearcher对象,这样每构造一个IndexSearcher对象,都要声明一个索引对象(实际上是一个索引的多次连接),而每个索引对象都要占用一定量的系统资源(主要是内存)。当大量用户访问系统时,就会看到系统内容直线增长,致使产生“java heap space”内存耗尽。这个问题可以通过以下方法解决:
每个索引都声明一个static的索引对象(即IndexReader对象),以后每个针对这个索引的索引都通过这个static对象声明IndexSearcher对象,也就是IndexSearcher的第三个构造函数的应用。