Hi Digy Thanks for your help.
I have a question here. I use the reader for other tasks, and later in my code the reader (_ir) is closed, and I just keep open the searcher. Or sometimes viceversa, I close the searcher and just keep the Reader open. If I use a single Reader on both instances(_ir and _is), what happens if I close either one or the other? Wouldn’t the other one be closed too? Or that means that I can use a single Reader to open different instances of IndexSearcher and close an IndexSearcher without affecting the other Searcher instances? Best regards Luis -----Original Message----- From: Digy [mailto:[email protected]] Sent: Friday, October 16, 2009 12:03 PM To: [email protected] Subject: RE: Port of Java Lucene 2.9 is under way Hi Luis, I think, you shouldn't reopen "_is.Reader". Just create a new IndexSearcher with the new "_ir". Your code(converted to c#) is below. See the comments. IndexReader newR = _ir.Reopen(); if (newR != _ir) { _ir.Close(); } _ir = newR; //REMOVED //IndexReader newSR = _is.Reader.Reopen(); //if (newSR != _is.Reader) //{ // _is.Close(); //} //_is = new IndexSearcher(newSR); _is = new IndexSearcher(_ir); //<--ADDED DIGY -----Original Message----- From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] Sent: Friday, October 16, 2009 6:49 PM To: [email protected] Subject: RE: Port of Java Lucene 2.9 is under way Hi all I've just created a new test project and I confirm that the exception occurs. The steps to reproduce: 1. Open the index Reader and/or Searcher. (Select and index flder or wrtite the path in the first textbox, then Click button "Open") 2. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button) 3. Modify the index. (Click the "Add doc" button, this will add a doc and close the Writer) 4. Check IsCurrent. Must return FALSE (Click the "IsCurrent?" button) 5. Reopen Searcer and/or Reader. (Click "Reopen" button) 6. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button) 6.1 Here I get: "Lucene.Net.Store.AlreadyClosedException: this Directory is closed at Lucene.Net.Store.Directory.EnsureOpen() in G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Store\Directory.cs:line 244 at Lucene.Net.Store.FSDirectory.List() in G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Store\FSDirectory.cs:line 386 at Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() in G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Index\SegmentInfos.cs:line 620 at Lucene.Net.Index.SegmentInfos.ReadCurrentVersion(Directory directory) in G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Index\SegmentInfos.cs:line 473 at Lucene.Net.Index.DirectoryIndexReader.IsCurrent() in G:\Installers\Desarrollo\LuceneNET\SVN\LuceneNET_SVN\trunk(2.4.0,2009-09-17)\C#\src\Lucene.Net\Index\DirectoryIndexReader.cs:line 232 at LuceneReopenTest.Form1.btnIsCurent_Click(Object sender, EventArgs e) in G:\Installers\Desarrollo\LuceneNET\Tests\LuceneReopenTest\LuceneReopenTest\Form1.vb:line 268" If instead of using Reopen you do a Close + Open, there is no exception. 1. Open the index Reader and/or Searcher. (Select and index flder or wrtite the path in the first textbox, then Click button "Open") 2. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button) 3. Modify the index. (Click the "Add doc" button, this will add a doc and close the Writer) 4. Check IsCurrent. Must return FALSE (Click the "IsCurrent?" button) 5. Close+Open Searcer and/or Reader. (Click "Close" then the "Open" button) 6. Check IsCurrent. Must return TRUE (Click the "IsCurrent?" button) 6.1 Here I get: TRUE :-) My test project code is below. It is just a VB project with a single form. Just create a new form, delete the "Form1.Designer.vb" file and paste the code in the "Form1.vb". ======================================================= Imports Lucene.Net.Index Imports Lucene.Net.Search <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Class Form1 Inherits System.Windows.Forms.Form 'Form overrides dispose to clean up the component list. <System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing AndAlso components IsNot Nothing Then components.Dispose() End If Finally MyBase.Dispose(disposing) End Try End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() Me.txtIndexFolder = New System.Windows.Forms.TextBox Me.btnBrowseFolder = New System.Windows.Forms.Button Me.bntOpen = New System.Windows.Forms.Button Me.btnClose = New System.Windows.Forms.Button Me.btnReopen = New System.Windows.Forms.Button Me.btnIsCurent = New System.Windows.Forms.Button Me.btnSearch = New System.Windows.Forms.Button Me.txtSearch = New System.Windows.Forms.TextBox Me.StatusStrip1 = New System.Windows.Forms.StatusStrip Me.statusLabel = New System.Windows.Forms.ToolStripStatusLabel Me.btnAdd = New System.Windows.Forms.Button Me.StatusStrip1.SuspendLayout() Me.SuspendLayout() ' 'txtIndexFolder ' Me.txtIndexFolder.Location = New System.Drawing.Point(12, 12) Me.txtIndexFolder.Name = "txtIndexFolder" Me.txtIndexFolder.Size = New System.Drawing.Size(713, 20) Me.txtIndexFolder.TabIndex = 0 ' 'btnBrowseFolder ' Me.btnBrowseFolder.Location = New System.Drawing.Point(731, 12) Me.btnBrowseFolder.Name = "btnBrowseFolder" Me.btnBrowseFolder.Size = New System.Drawing.Size(24, 20) Me.btnBrowseFolder.TabIndex = 1 Me.btnBrowseFolder.Text = "..." Me.btnBrowseFolder.UseVisualStyleBackColor = True ' 'bntOpen ' Me.bntOpen.Location = New System.Drawing.Point(12, 38) Me.bntOpen.Name = "bntOpen" Me.bntOpen.Size = New System.Drawing.Size(75, 23) Me.bntOpen.TabIndex = 2 Me.bntOpen.Text = "Open" Me.bntOpen.UseVisualStyleBackColor = True ' 'btnClose ' Me.btnClose.Location = New System.Drawing.Point(93, 38) Me.btnClose.Name = "btnClose" Me.btnClose.Size = New System.Drawing.Size(75, 23) Me.btnClose.TabIndex = 3 Me.btnClose.Text = "Close" Me.btnClose.UseVisualStyleBackColor = True ' 'btnReopen ' Me.btnReopen.Location = New System.Drawing.Point(174, 38) Me.btnReopen.Name = "btnReopen" Me.btnReopen.Size = New System.Drawing.Size(75, 23) Me.btnReopen.TabIndex = 4 Me.btnReopen.Text = "Reopen" Me.btnReopen.UseVisualStyleBackColor = True ' 'btnIsCurent ' Me.btnIsCurent.Location = New System.Drawing.Point(255, 38) Me.btnIsCurent.Name = "btnIsCurent" Me.btnIsCurent.Size = New System.Drawing.Size(75, 23) Me.btnIsCurent.TabIndex = 5 Me.btnIsCurent.Text = "IsCurrent?" Me.btnIsCurent.UseVisualStyleBackColor = True ' 'btnSearch ' Me.btnSearch.Location = New System.Drawing.Point(680, 67) Me.btnSearch.Name = "btnSearch" Me.btnSearch.Size = New System.Drawing.Size(75, 20) Me.btnSearch.TabIndex = 6 Me.btnSearch.Text = "Search" Me.btnSearch.UseVisualStyleBackColor = True ' 'txtSearch ' Me.txtSearch.Location = New System.Drawing.Point(12, 67) Me.txtSearch.Name = "txtSearch" Me.txtSearch.Size = New System.Drawing.Size(662, 20) Me.txtSearch.TabIndex = 7 ' 'StatusStrip1 ' Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.statusLabel}) Me.StatusStrip1.Location = New System.Drawing.Point(0, 375) Me.StatusStrip1.Name = "StatusStrip1" Me.StatusStrip1.Size = New System.Drawing.Size(767, 22) Me.StatusStrip1.TabIndex = 8 Me.StatusStrip1.Text = "StatusStrip1" ' 'statusLabel ' Me.statusLabel.Name = "statusLabel" Me.statusLabel.Size = New System.Drawing.Size(111, 17) Me.statusLabel.Text = "ToolStripStatusLabel1" ' 'btnAdd ' Me.btnAdd.Location = New System.Drawing.Point(336, 38) Me.btnAdd.Name = "btnAdd" Me.btnAdd.Size = New System.Drawing.Size(75, 23) Me.btnAdd.TabIndex = 9 Me.btnAdd.Text = "Add doc" Me.btnAdd.UseVisualStyleBackColor = True ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(767, 397) Me.Controls.Add(Me.btnAdd) Me.Controls.Add(Me.StatusStrip1) Me.Controls.Add(Me.txtSearch) Me.Controls.Add(Me.btnSearch) Me.Controls.Add(Me.btnIsCurent) Me.Controls.Add(Me.btnReopen) Me.Controls.Add(Me.btnClose) Me.Controls.Add(Me.bntOpen) Me.Controls.Add(Me.btnBrowseFolder) Me.Controls.Add(Me.txtIndexFolder) Me.Name = "Form1" Me.Text = "Form1" Me.StatusStrip1.ResumeLayout(False) Me.StatusStrip1.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() End Sub Friend WithEvents txtIndexFolder As System.Windows.Forms.TextBox Friend WithEvents btnBrowseFolder As System.Windows.Forms.Button Friend WithEvents bntOpen As System.Windows.Forms.Button Friend WithEvents btnClose As System.Windows.Forms.Button Friend WithEvents btnReopen As System.Windows.Forms.Button Friend WithEvents btnIsCurent As System.Windows.Forms.Button Friend WithEvents btnSearch As System.Windows.Forms.Button Friend WithEvents txtSearch As System.Windows.Forms.TextBox Friend WithEvents StatusStrip1 As System.Windows.Forms.StatusStrip Friend WithEvents statusLabel As System.Windows.Forms.ToolStripStatusLabel Friend WithEvents btnAdd As System.Windows.Forms.Button Private _ir As IndexReader Private _is As IndexSearcher Private Sub btnBrowseFolder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowseFolder.Click Using ofd As New FolderBrowserDialog ofd.SelectedPath = txtIndexFolder.Text If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then txtIndexFolder.Text = ofd.SelectedPath End If End Using End Sub Private Sub bntOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bntOpen.Click Dim sDir As String = txtIndexFolder.Text.Trim If sDir = "" OrElse IO.Directory.Exists(sDir) = False Then MessageBox.Show("Select the index directory.") Exit Sub End If Try _ir.EnsureOpen() MessageBox.Show("Reader is already open.") Exit Sub Catch ex As Exception ' Reader is not open, continue End Try _ir = IndexReader.Open(sDir) _is = New IndexSearcher(sDir) statusLabel.Text = "Index open." End Sub Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Try _ir.EnsureOpen() Catch ex As Exception MessageBox.Show("Reader is closed.") Exit Sub End Try _ir.Close() _is.Close() statusLabel.Text = "Index closed" End Sub Private Sub btnReopen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReopen.Click Try _ir.EnsureOpen() Catch ex As Exception MessageBox.Show("Reader is closed.") Exit Sub End Try Dim newR As IndexReader Dim newSR As IndexReader Try newR = _ir.Reopen If newR IsNot _ir Then ' READER ' Store a reference to the old reader to close it later Try _ir.Close() Catch ' do Nothing, just in case its already closed an exception can occur End Try ' Set Reader to the new reopened instance _ir = newR End If newSR = _is.Reader.Reopen If newSR IsNot _is.Reader Then ' SEARCHER Try ' We dont need this since we created the Searcher with a string "c:\asdasfd\" '_is.Reader.Close _is.Close() Catch ex As Exception ' do Nothing, just in case its already closed an exception can occur End Try ' Create a new Searcher using the reopened reader _is = New IndexSearcher(newSR) End If Catch ex As Exception MessageBox.Show("Error reopening index: " + ex.Message) End Try End Sub Private Sub btnIsCurent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIsCurent.Click Try _ir.EnsureOpen() Catch ex As Exception MessageBox.Show("Reader is closed.") Exit Sub End Try Try MessageBox.Show("Reader is current=" + _ir.IsCurrent.ToString) MessageBox.Show("Searcher is current=" + _is.Reader.IsCurrent.ToString) Catch ex As Exception MessageBox.Show("ERROR gettings IsCurrent: " + ex.Message + vbCrLf + ex.ToString) End Try End Sub Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click If txtSearch.Text.Trim <> "" Then Dim qp As New Lucene.Net.QueryParsers.QueryParser("", New Lucene.Net.Analysis.WhitespaceAnalyzer()) Dim q As Query = qp.Parse(txtSearch.Text) Dim topD As Lucene.Net.Search.TopDocs = _is.Search(q, 100) End If End Sub Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click Try _ir.EnsureOpen() Catch ex As Exception MessageBox.Show("Reader is closed.") Exit Sub End Try Dim _iw As IndexWriter Try _iw = New IndexWriter(txtIndexFolder.Text, New Lucene.Net.Analysis.WhitespaceAnalyzer(), False, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED) Dim d As New Lucene.Net.Documents.Document() Dim f As New Lucene.Net.Documents.Field("fieldName", "fieldValue", Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED) d.Add(f) _iw.AddDocument(d) _iw.Commit() Catch ex As Exception MessageBox.Show("Error: " + ex.Message + vbCrLf + ex.ToString) Finally If _iw IsNot Nothing Then _iw.Close() End If End Try End Sub End Class ======================================================= Saludos, Luis -----Original Message----- From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] Sent: Thursday, October 15, 2009 5:04 PM To: '[email protected]' Subject: RE: Port of Java Lucene 2.9 is under way Just to confirm I've just downloaded the version in the trunk and it’s the same version I have in my environment. -----Original Message----- From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] Sent: Thursday, October 15, 2009 3:55 PM To: [email protected]; [email protected] Subject: RE: Port of Java Lucene 2.9 is under way Hi Michael I'm not sure if I have latest version from the trunk. I'll check that right now. The error is: "Lucene.Net.Store.AlreadyClosedException: this Directory is closed at Lucene.Net.Store.Directory.EnsureOpen() in G:\Projects\Code\LN_2_4_0\src\LN\Store\Directory.cs:line 246 at Lucene.Net.Store.FSDirectory.List() in G:\Projects\Code\LN_2_4_0\src\LN\Store\FSDirectory.cs:line 389 at Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run() in G:\Projects\Code\LN_2_4_0\src\LN\Index\SegmentInfos.cs:line 623 at Lucene.Net.Index.SegmentInfos.ReadCurrentVersion(Directory directory) in G:\Projects\Code\LN_2_4_0\src\LN\Index\SegmentInfos.cs:line 476 at Lucene.Net.Index.DirectoryIndexReader.IsCurrent() in G:\Projects\Code\LN_2_4_0\src\LN\Index\DirectoryIndexReader.cs:line 235 at TextIndexLucene.TIdxLucene.TIdxL.IsCurrent() in G:\Projects\Code\TextIndexLucene\TxtIdxL.vb:line 3491 at TextIndexLuceneTestBed.frmMain.DoSearch() in G:\Projects\Code\TextIndexLuceneTestBed\frmMain.vb:line 2201" >From what I read from the post in the Lucene-Java and from debugging, the >problem is that the Directory/FSDirectory are being closed recursively, and it >eventually closes all Directories and resets all ref count to 0. And as I undertand from the post is happens when you create the Reader/Searcher using a string "NEW Reader("c:\indexfolder\")" and later you reopen the index using a Directory (FSDirectory for example), it calls DecRef() recursively until it reaches 0. And later when I call IsCurrent() it throws -AlreadyClosedException("this IndexReader is closed")- when EnsureOpen() is called because the refCount is <=0. I'll try to write a function to reproduce the problem. Thanks in advance for your help. Saludos, Luis -----Original Message----- From: Michael Garski [mailto:[email protected]] Sent: Thursday, October 15, 2009 12:42 PM To: [email protected]; [email protected] Subject: RE: Port of Java Lucene 2.9 is under way Luis, What issue are you having with the IndexReader.Reopen() method? We use it for the same reasons you are and do not have any issues with it using the latest version in the trunk. Michael -----Original Message----- From: Luis Fco. Ramirez Daza Gonzalez [mailto:[email protected]] Sent: Wednesday, October 14, 2009 7:13 PM To: [email protected]; [email protected] Subject: RE: Port of Java Lucene 2.9 is under way Hi George I just want to know the status of the 2.9 port. I'm thinking of trying it because we are using 2.4 and I think we are hitting a bug with the Reopen method. I was looking for a solution and found a thread in the Java JIRA that says the fix wont be ported back to 2.4, but I think it is solved in 2.9 in with a patch: https://issues.apache.org/jira/browse/LUCENE-1453 The reopen function is very important for us because we update the index very often, and right now we have to Close + Open each time we update the index, and because we use custom sort field, we also need to warm up each time we Close+Open, and all that seems to be solved with the Reopen. Thanks Best regards Luis -----Original Message----- From: George Aroush [mailto:[email protected]] Sent: Wednesday, September 16, 2009 9:32 PM To: [email protected]; [email protected] Subject: Port of Java Lucene 2.9 is under way Hi folks, This is to let you know that I have begun the porting process of Java Lucene 2.9 to Lucene.Net. I hope in few weeks (maybe even next week) to have an early release checked-into SVN. If you are following Java Lucene mailing list, you will know that 2.9 is currently undergoing release as Release Candidate 4 and RC5 is expected (a bug was found in RC4). My port is based on RC3, but changes between Java Lucene 2.9 RC3 and soon to come RC5 aren't major to side track my port. With 2.9 release, we should be able to keep Java Lucene and Lucene.Net releases very close; my hope is, any further ports should be an accumulation of Java Lucene SVN commits ports vs. waiting for a new release to do a chunk release. I'm not sure if this goal can be achieved, but we will see. Regards, -- George
