3

Lucene.NETに問題があります。インデックス作成中に、「パスセグメントへのアクセスが拒否されました」というエラーが表示されます。または、「削除可能なパスへのアクセスが拒否される」場合もあります。最終的に「Everyone」にインデックスディレクトリへの完全なセキュリティ権限を付与しましたが、問題は依然として存在していました。

次に、インデックスの実行中に、luceneがセグメントファイルの名前を「segments.new」に変更するとこのエラーが発生することがわかりました。名前が変更された後でも、一部のプロセスが古いセグメントファイルから読み取ろうとしていると思いますか?なぜこれが起こるのか、またはこれを修正する方法についての手がかりはありません。不思議なことに、私の共同開発者は問題なく自分のコンピューターでインデックスを実行できます。

エラーは、Lucene.Net.Index.IndexModifier.AddDocument(Document)で発生します。

どんなアイデアでも大歓迎です。

4

5 に答える 5

1

この問題は、オンラインウイルススキャナーがsegments(.new)ファイルをロックしていることが原因で発生します。これを回避するには、カスタムのLuceneDirectory実装を作成する必要がありました。

于 2008-11-20T11:04:32.600 に答える
1

私は解決策を見つけたと思います..少なくともそれは私にとってはうまくいきました..「segments.new」の問題をテストしていて、以下にコードがあります..ループでわかるように、何千ものluceneドキュメントを作成しました(6000).. 約 1360 ドキュメントで、blablabla の名前を変更できなかったというエラーが表示されます.. コードは C# で記述されています.. 基本的に、エラーに対して (ループ内に) try catch を挿入するだけで、エラーが表示されたら、もう一度 int ループ nunmber(y) を 1 (y = y - 1) 減算してみてください。

//-----------------問題------------------------------ -------

for (int y = 0; y < 6000; y++) { Document doc = new Document();

 doc.Add(new Field("URL", "C:/Users/blabla/(convert-csharp)/IMssg", Field.Store.YES, Field.Index.TOKENIZED));

 writer.AddDocument(doc);

}

//--------------------解決策--------------------------- -------------

IndexWriter writer = new IndexWriter("C:/Users/blabla/(convert-csharp)/IMssg", new StandardAnalyzer(), false);

for (int y = 0; y < 6000; y++) { 試行 {

 Document doc = new Document();

 doc.Add(new Field("URL", "C:/Users/blabla/(convert-csharp)/IMssg", Field.Store.YES, Field.Index.TOKENIZED));

 writer.AddDocument(doc);

  }
   catch (Exception t) 
  {

   y = (y < 0) ? 0 : y - 1;

   string gfff = t.Message.ToString();

   }

}

ライター.Close();

私は英語の男ではないので、言葉に誤りがあれば申し訳ありません...今ではimmanouelを考慮しています

于 2009-08-25T01:55:40.803 に答える
1

あなたの IndexModifier が Searcher と競合していると思われます。

バグ追跡アプリBugTracker.NETで Lucene.Net を使用する方法は次のとおりです。これは正常に動作しているようです。

アプリの起動時にインデックスを作成します。

サーチャーを作成し、検索のたびにインデックスがリロードされないように保持します。すべてのスレッドが同じサーチャーを共有します。サーチャーが検索するとき、別のスレッドが検索できるように、ロックを取得し、検索してからロックを解放します。Lucene.NET は高速であり、バグ追跡システムはそれほどビジーではないため、検索を単一ファイルに強制することは、私のアプリで実行可能です。

一方、データが変更されたときにインデックスを更新する IndexWriter があります。少し変更しているだけなので、タスクも迅速に実行されます。実行が必要になると、同じロックを取得し、サーチャーを破棄し、インデックスを更新し、サーチャーを再作成します。新しいサーチャーは、インデックスの次の更新まで残ります。サーチャーは常に最新のインデックスを使用しています。

BugTracker.NET ソースを入手して、ファイル my_lucene.cs と search_text.aspx を確認できます。この 2 つのファイルにすべてが含まれており、それほど多くのコードはありません。

于 2008-11-07T10:14:41.883 に答える
1

私は Imma のソリューションを 2 番目に使用します。私もこの問題を抱えていました。私にとっての修正は、IndexWriter.AddDocument(doc) の周りに try/catch を配置することでした。

 int attemptNo = 0;
 while (attemptNo < 2)
 {
    try
    {
       writer.AddDocument(doc);
       break;
    }
    catch (Exception e)
    {
       String ErrMsg = String.Format("{0} ({1}): While adding Document {2}/{3}, caught {4}", DateTime.Now, attemptNo, doc.GetField("kanji").StringValue(), doc.GetField("kana").StringValue(), e.Message);
       attemptNo++;
       System.Threading.Thread.Sleep(30);
       Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
       {
          ViewModel.Log.Add(ErrMsg);
       });
    }

参照: http://issues.apache.org/jira/browse/LUCENE-665 :

「問題の要点は次のとおりです。Windowsでは、segments.newをsegmentsに、またはdeletable.newをdeletableに名前変更する際に断続的な「アクセス拒否」エラーが表示されることがあります.Luceneは通常、最初にファイルをX.newに書き込み、次に名前を変更しますバツ。"

于 2009-12-11T04:22:20.980 に答える
0

私はこれについて読みました。ただし、実行中のウイルス スキャナーはありません。また、インデックス ディレクトリの Vista 検索インデックスを無効にし、タスク マネージャーから検索インデックス プロセスを強制終了して、他のプロセスがファイルをロックしていないことを確認しました。残念ながら、役に立ちませんでした。さらに、問題は、アクセスしようとしている「セグメント」ファイルがなくなったことにあるようです (lucene がファイルの名前を segment.new に変更したため)。同じ問題かどうかはわかりませんが…

于 2008-11-24T08:15:53.080 に答える