2009-08-28 11 views
1

IndexSearcherを使用してインデックスをロックしないで、読み取り専用モードで開くことはできますか?Lucene.NET readonly IndexSearcher

は、今私はちょうど私が読み取り専用モードでその開口部を読んでてきた

var searcher = new IndexSearcher(LuceneIndexPath); 

ので、私はそれについて移動する方法を思っていたパフォーマンスが向上しています。私はこのテーマについて多くの文書を見つけることができませんでした。

答えて

11

これだけの場合は、後でパフォーマンスについて心配する必要があります。あなたは、インデックスの権限をいじるに頼る前に、ここでは、Luceneのと一緒に行くを取得するためのヒントのカップルです:

  • のLuceneはないデータベースです。これはインデックスです。索引付けされていない以外のフィールドはすべて、非常に効果的な方法で最小化されます。検索が行われると、データの一意のハッシュと一致するようにクエリも最小化されます。あなたが検索するために格納していないものは、から情報を回復するために使用するものでなければなりません。 DBから。これにより、インデックスのサイズ(したがって検索速度)を一桁下げることができます。
  • ステムすべて -は、テキスト内の単語の長さを短くするためにPorter Stemmerと同じように単純化してもsomethignを使用します。クエリを作成するときにも、それを省略します。これはインデックスのサイズとクエリの速度にはほとんど影響しませんが、検索の堅牢性も向上します。
  • ストップワード?誰が必要なの?真剣に、ストップワードの良いリストを見つけて、インデックス作成を計画しているフィールドから削除してください。あなたが英語のテキストで見つけ出す最も頻繁な用語は、情報検索に関して全く無益です。つまり、あなたがそれらを保管しているなら、あなたのデータベースはおそらく非常に不必要に大きいでしょう。歩道に書かれた同じ大きさの手紙を横切って歩くことを想像してみてください。 「良い、悪い、そして醜い」が「良い、悪い、醜い」と比較してどれくらいの期間を取るのだろうか?

これらの3つの主要な側面が最初に対処されていることを確認してください。パフォーマンスに関してそれほど心配する必要はありません。これらの問題が解決される前にパフォーマンスについて心配すると、悪意を持って悪用される「時期尚早の最適化」の1つになります。

4

私は最近これについて読み、最短時間のためのオープンなリーダーを残して、読み取り専用形式でindexsearcherを使用するには、この方法を思いついた:

private T searchIndex<T>(Func<IndexSearcher, T> searchAction) 
{ 
    var indexReader = IndexReader.Open(_indexDirectory, true); 
    var indexSearcher = new IndexSearcher(indexReader); 

    var result = searchAction(indexSearcher); 

    indexSearcher.Close(); 
    indexReader.Close(); 

    return result; 
} 

コードを消費することは、この

var hits = searchIndex(s=> { 
    var query = _queryParser.Parse(searchString); 
    return indexSearcher.Search(query); 
}); 
ようになります