luceneマルチスレッド単純実践記録

2297 ワード

必要に応じてluceneを再度使用し、以前はこれ(1.4.3バージョン)を使用していたが、現在使用されているapi(3.3.0)の多くはまだ調べられていないが、慣用法が異なると言っているだけで、ここに記録しておく.
 
1:分詞については、こちらを参考にしてください
http://www.open-open.com/74.htm
分詞コンポーネント用のJE上のIK分詞も、いろいろ考えて使っていますが、インデックスと検索時に2つのアナライザが同じように使うことを確保する必要があります.
前に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
私たちができることはRAM Bufferのサイズを設定することです.このサイズは大きいほど良いとは言えませんが、実際の状況も考慮する必要があります.一般的には最大ファイルの2倍ではあまり調べられません.デフォルト値は16 Mで、setRAM BufferSizeMBを利用してサイズを設定することができます.
 
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:インデックスの更新に対して、私のここは1日1日更新で、リアルタイムの更新をする必要はありません、リアルタイムの更新はsolrの実現などの他のことを考慮することができて、1日1日更新して、取った策略は、新しいインデックスが創立してから直接インデックスと検索の対象の実例を置き換えて、古いインデックスのデータは削除して、参照の間の置換は瞬間的に完成することができます、だからリアルタイムインデックスが他のマシンにあれば、新しい検索器が確立されたら、瞬時に置き換えることができます.