首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

lucene 多线程简略实践记录

2012-06-30 
lucene 多线程简单实践记录出于需要,再次使用lucene,之前毕设用的这个(1.4.3版本),现在用的很多api(3.3.0)

lucene 多线程简单实践记录

出于需要,再次使用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的实现等等,一天一更新,采取的策略是,新索引建立好了以后直接替换 索引和 搜索的对象实例,老的索引数据删除,引用之间的替换可以说是瞬间完成,所以如果实时索引在其他机器,当新的搜索器建立好了,可以瞬间替换的。

热点排行