Hi Garry, I am guessing the directory needs to be closed before opening a new one.
dir.close(); dir = FSDirectory.open(new File(getIndexPath())); why not to open two IndexSearcher objects in an array of two instead of swapping them back and forth? it would be a lot easier. yuhan 2011/1/12 张志田 <zhitian.zh...@dianping.com> > Hi Mike, > > Sorry to make you confused. "lock" means the file handle is held by some > other progress, the program can not delete it. There is no exception, I can > see file.delete() method returns false. If I delete the cfs file in the OS > manually, the warning is "File was using by another person or program" > > To simplify my question, I made some more code for testing. you can run it > for reproducing, after two loops, you will see the message e.g. "Can not > delete file: D:\index\index2\_0.cfs" > > > Thank you very much > > > public class SearchTest > { > > private static final int MAX_RESULT = 10000; > > private String indexPath1 = "D:\\index\\index1"; > > private String indexPath2 = "D:\\index\\index2"; > > private String backupIndexpath = "D:\\index\\index3"; > > private String indexPath = indexPath1; > > private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); > > private IndexSearcher searcher; > > public void search() > { > while (true) > { > try > { > String keyword = "test"; > String fieldName = "searchfield"; > > Directory 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; > > File newFile = new File(getIndexPath()); > for (File file : newFile.listFiles()) > { > if (!file.delete()) > { > System.out.println("Can not delete file: " + > file.getAbsolutePath()); > } > } > > // Copy index File from another folder to this folder > copyDir(new File(backupIndexpath), newFile); > > Directory newDir = FSDirectory.open(newFile); > IndexSearcher newSearcher = new IndexSearcher(newDir); > 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 copyDir(File sourceLocation, File targetLocation) > throws IOException > { > String[] children = sourceLocation.list(); > for (int i = 0; i < children.length; i++) > { > InputStream in = null; > OutputStream out = null; > try > { > in = new FileInputStream(new File(sourceLocation, > children[i])); > out = new FileOutputStream(new File(targetLocation, > children[i])); > > byte[] buf = new byte[1024]; > int len; > while ((len = in.read(buf)) > 0) > { > out.write(buf, 0, len); > } > } > catch (FileNotFoundException e) > { > e.printStackTrace(); > } > catch (IOException ioe) > { > ioe.printStackTrace(); > } > finally > { > try > { > if (in != null) > { > in.close(); > } > if (out != null) > { > out.close(); > } > } > catch (IOException e) > { > e.printStackTrace(); > } > } > } > } > > public static void main(String[] args) > { > SearchTest searchTest = new SearchTest(); > searchTest.search(); > } > > } > > 在 2011年1月12日 下午11:53,Michael McCandless <luc...@mikemccandless.com>写道: > > > 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.zh...@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 <luc...@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.zh...@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-unsubscr...@lucene.apache.org > > For additional commands, e-mail: java-user-h...@lucene.apache.org > > > > > > > -- > 张志田 > > 大众点评网 - 技术部 > 电话:52521070 - 1675 >