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