`

lucene 多线程简单实践记录

    博客分类:
  • JAVA
 
阅读更多

出于需要,再次使用lucene,之前毕设用的这个(1.4.3版本),现在用的很多api(3.3.0)还查不多,只是说有些惯用法不一样了,这里记录下。

 

1:关于分词,可以去这里参考下

http://www.open-open.com/74.htm

分词组件用的JE上的IK分词,也是经过多方考虑才使用这个,需要确保一点是,索引和搜索的时候2个分析器要使用一样的,之前自作聪明得用了lucene自带的空格分词器结果and操作就有问题。

如果之前有用过JE分词的话,也还记得这个东西,之前在open-open上有的,现在已经下架了,最后的版本是1.5.3

 

2:关于索引优化方面

IndexWriter 这个类的所有方法都是线程安全的,具体见javadoc

 

<a name="thread-safety"></a><p><b>NOTE</b>: {@link
  IndexWriter} instances are completely thread
  safe, meaning multiple threads can call any of its
  methods, concurrently.  If your application requires
  external synchronization, you should <b>not</b>
  synchronize on the <code>IndexWriter</code> instance as
  this may cause deadlock; use your own (non-Lucene) objects
  instead. </p>

 所以可以多线程的使用addDoc操作,这个具体的线程还依赖一个因子maxThreadStates,这个的默认值是8

 

 /** The maximum number of simultaneous threads that may be
   *  indexing documents at once in IndexWriter; if more
   *  than this many threads arrive they will wait for
   *  others to finish. */
  public final static int DEFAULT_MAX_THREAD_STATES = 8;

 不过如果你的机器核数不超过8的话,这个值可以不用修改了,已经足够使用了。

 

参考下 wiki 

How to make indexing faster

http://wiki.apache.org/lucene-java/ImproveIndexingSpeed

我们可以做的是 设置RAMBuffer的大小,这个大小不是说越大越好,也需要考虑实际情况,一般是最大文件的2倍就查不多了,默认值是16M ,可以利用 setRAMBufferSizeMB 来设置大小。

 

3:关于搜索

参考下wiki

How to make searching faster

http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

 1)Open the IndexReader with readOnly=true

 2)using NIOFSDirectory instead of FSDirectory.

 

4:针对索引更新,我这里是一天一更新,不需要做实时更新,实时更新可以考虑其他的如solr的实现等等,一天一更新,采取的策略是,新索引建立好了以后直接替换 索引和 搜索的对象实例,老的索引数据删除,引用之间的替换可以说是瞬间完成,所以如果实时索引在其他机器,当新的搜索器建立好了,可以瞬间替换的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics