lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael McCandless <luc...@mikemccandless.com>
Subject Re: Can not delete index file after close the IndexSearcher
Date Wed, 12 Jan 2011 15:53:02 GMT
Hmmm.

When you say "locked" what actually does that mean?  Can you post the exception?

Also, can you whittle down your example even more?   EG if calling
this method twice causes the problem, make a method that calls it
twice and hits the exception and then start simplifying from there...

Mike

2011/1/12 张志田 <zhitian.zhang@dianping.com>:
> Mike, thanks for your feedback.
>
> I verified this in the debug mode, so I just check the folder I closed in
> the last loop. Actually, both two folders are locked.
>
> tried with new FSDirectory every loop, no help.
>
> Garry
>
> 2011/1/12 Michael McCandless <lucene@mikemccandless.com>
>
>> When you break out of the loop (user enters 'Q') you don't close the
>> current searcher.  Could that be it?
>>
>> Also you are calling FSDir.open each time but should only do it once
>> (though this should be "harmless").
>>
>> Mike
>>
>> On Wed, Jan 12, 2011 at 5:39 AM, 张志田 <zhitian.zhang@dianping.com> wrote:
>> > Dear Luceners,
>> >
>> > I'm using lucene-3.0.2 in our app. There is some testing code for
>> switching
>> > index, however, when my code run a couple of times, I found the index
>> file
>> > was locked, I can not delete the old index files.
>> >
>> >
>> > The code looks like:
>> >
>> > public class SearchTest
>> > {
>> >
>> >    private static final int MAX_RESULT = 10000;
>> >
>> >    private String indexPath1 = "D:\\index\\index1";
>> >    private String indexPath2 = "D:\\index\\index2";
>> >
>> >    private String indexPath = indexPath1;
>> >
>> >    private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
>> >
>> >    private Directory dir = null;
>> >
>> >    private IndexSearcher searcher;
>> >
>> >    public void search()
>> >    {
>> >        while(true)
>> >        {
>> >            try
>> >            {
>> >                String keyword = "test";
>> >                String fieldName = "searchfield";
>> >
>> >                if(dir == null)
>> >                {
>> >                    dir = FSDirectory.open(new File(indexPath));
>> >                }
>> >                searcher = new IndexSearcher(dir);
>> >
>> >                QueryParser queryParse = new
>> QueryParser(Version.LUCENE_30,
>> > fieldName, analyzer);
>> >                Query query = queryParse.parse(keyword);
>> >
>> >                TopDocs hits = searcher.search(query, MAX_RESULT);
>> >                int size = 5;
>> >                if(hits.scoreDocs.length < size)
>> >                {
>> >                    size = hits.scoreDocs.length;
>> >                }
>> >                for (int i = 0; i < size; i++)
>> >                {
>> >                    Document doc = searcher.doc(hits.scoreDocs[i].doc);
>> >                    String text = doc.get(fieldName);
>> >                    System.out.println("fieldContent is: " + text);
>> >                }
>> >
>> >                IndexSearcher oldSearcher = searcher;
>> >                dir = FSDirectory.open(new File(getIndexPath()));
>> >                IndexSearcher newSearcher = new IndexSearcher(dir);
>> >                searcher = newSearcher;
>> >
>> >                oldSearcher.close();
>> >                System.out.println("Closed Searcher: " +
>> > oldSearcher.getIndexReader().directory().toString());
>> >
>> >                System.out.println("input 'Q' to quit testing...");
>> >                BufferedReader br = new BufferedReader(new
>> > InputStreamReader(System.in));
>> >
>> >                if(br.readLine().trim().equals("Q"))
>> >                {
>> >                    break;
>> >                }
>> >            }
>> >            catch (CorruptIndexException e)
>> >            {
>> >                e.printStackTrace();
>> >            }
>> >            catch (IOException e)
>> >            {
>> >                e.printStackTrace();
>> >            }
>> >            catch (ParseException e)
>> >            {
>> >                e.printStackTrace();
>> >            }
>> >        }
>> >    }
>> >
>> >    private String getIndexPath()
>> >    {
>> >        if(indexPath.equals(indexPath1))
>> >        {
>> >            indexPath = indexPath2;
>> >        }
>> >        else
>> >        {
>> >            indexPath = indexPath1;
>> >        }
>> >
>> >        return indexPath;
>> >    }
>> >
>> >    public static void main(String[] args)
>> >    {
>> >        SearchTest searchTest = new SearchTest();
>> >        searchTest.search();
>> >    }
>> >
>> > }
>> >
>> > Can anybody take a look at the above code snippet?
>> >
>> > I want to search on the different index file every time so I created two
>> > different folders and switch them time to time. The index files in the
>> > index1/index2 maybe replaced before the search request comes.
>> >
>> > The problem I found is after I ran the above code 2 or more loops, I can
>> not
>> > modify/delete the cfs/cfx file in the file system(Windows 2003), although
>> I
>> > closed the searcher every time in the code. It seems that the index file
>> is
>> > not released.
>> >
>> > Is the problem caused by the shared reference of searcher? or some shared
>> > thread in the lucene?
>> >
>> > Thanks in advance!
>> > Garry
>> >
>>
>
>
>
> --
> 张志田
>
> 大众点评网 - 技术部
> 电话:52521070 - 1675
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org


Mime
View raw message