论坛首页 入门技术论坛

lunece建立索引遇到的问题

浏览 6384 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-31  

 

最近对lucene的检索进行了肤浅的学习  先是把论坛里大部分的lucene的帖子看了下  大致了解了下lucene   决定学习  在自己测试的时候  发现在对大表的创建索引时耗费的时间实在太长 想通过多线程来解决 对一个表的总记录数来决定创建几个线程来创建索引, 结果是报错:

 D:\lucene\index\_a.fnm (系统找不到指定的文件。)

Lock obtain timed out: SimpleFSLock@D:\lucene\index\write.lock

之类

 

难道lucene创建索引耗费是太长的问题真的没有解决  ,因为是初学没有去研究源代码  只是在自己的博客上发发感概  无意看到我篇文章的朋友不要笑我肤浅啊 鼓了勇气才敢来写第一篇博客的

我测试的代码:

主函数:

java 代码
  1. package luceneTest;   
  2.   
  3. import java.io.File;   
  4. import java.sql.Connection;   
  5. import java.sql.PreparedStatement;   
  6. import java.sql.ResultSet;   
  7. import java.sql.SQLException;   
  8. import java.sql.Statement;   
  9.   
  10. import dataConnectionPool.DataConnectionPool;   
  11.   
  12. public class TMain {   
  13.     private String find = " select id,name from author";   
  14.     private Connection con;   
  15.     private Statement stmt;   
  16.     private File indexFile;   
  17.     private int count ;   
  18.     public TMain(File indexFile)   
  19.     {   
  20.         this.indexFile = indexFile;   
  21.         this.count = countD();   
  22.     }   
  23.     public int countD()   
  24.     {      
  25.         int count=0;   
  26.         try {   
  27.             con = DataConnectionPool.getBasicDataSource().getConnection();   
  28.             stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);   
  29.             ResultSet rs  = stmt.executeQuery(find);   
  30.             while(rs.next())   
  31.            {   
  32.                   rs.last(); // 移动到最后一行    
  33.                   count = rs.getRow(); // 获得当前行号:此处即为最大记录数    
  34.            }    
  35.                
  36.             System.out.println(" 表的总记录数 :"+count);   
  37.         } catch (SQLException e) {   
  38.             // TODO Auto-generated catch block   
  39.             e.printStackTrace();   
  40.         }   
  41.         return count;   
  42.     }   
  43.     public void create() throws InterruptedException   
  44.     {   
  45.         int num = count/10;   
  46.            
  47.         for(int i = 1;i<=num;i++)   
  48.         {   
  49.             System.out.println("main start :"+((i-1)*10+1));   
  50.             CDataIndex cd = new CDataIndex(((i-1)*10+1),10,indexFile);   
  51.   
  52.                 cd.start();   
  53.                
  54.        
  55.         }      
  56.     }   
  57.     public void print(File indexFile, String markInfo)   
  58.     {   
  59.         FData fd = new FData(indexFile,markInfo);   
  60.         fd.findData();   
  61.     }   
  62.        
  63.     public static void main(String[] args) {   
  64.         // TODO Auto-generated method stub   
  65.      File indexFile = new File("D:/lucene/index");   
  66.      String markInfo = "you";   
  67.      TMain tm = new TMain(indexFile);   
  68.       try {   
  69.         tm.create();   
  70.           tm.print(indexFile, markInfo);   
  71.     } catch (InterruptedException e) {   
  72.         // TODO Auto-generated catch block   
  73.         e.printStackTrace();   
  74.     }       
  75.     }   
  76.   
  77. }   

 

调用一个建立索引的类:

java 代码
  1. package luceneTest;   
  2.   
  3. import java.io.File;   
  4. import java.io.IOException;   
  5. import java.sql.Connection;   
  6. import java.sql.PreparedStatement;   
  7. import java.sql.ResultSet;   
  8. import java.sql.SQLException;   
  9. import java.util.Date;   
  10.   
  11. import org.apache.lucene.analysis.cjk.CJKAnalyzer;   
  12. import org.apache.lucene.document.Document;   
  13. import org.apache.lucene.document.Field;   
  14. import org.apache.lucene.index.IndexReader;   
  15. import org.apache.lucene.index.IndexWriter;   
  16. import org.apache.lucene.store.FSDirectory;   
  17.   
  18. import dataConnectionPool.DataConnectionPool;   
  19.   
  20. public class CDataIndex extends Thread {   
  21.     private Connection con;   
  22.     private String find = " select id,name from author";   
  23.     private PreparedStatement ps;   
  24.     private int start = 0;   
  25.     private int num = 0;   
  26.     private File indexFile;   
  27.     private boolean mark = false;    //通过这个来控制是用增量索引还是全局索引
  28.     public CDataIndex(int start,int num,File indexFile)   
  29.     {   
  30.         this.start = start;   
  31.         this.num = num;   
  32.         this.indexFile = indexFile;   
  33.     }   
  34.        
  35.        
  36.        
  37.     public void run()   
  38.     {   
  39.            
  40.         System.out.println(" 开始索引!");   
  41.         Date beginDate = new Date();               
  42.                
  43.             try {   
  44.                 FSDirectory fsd =  FSDirectory.getDirectory(indexFile.getAbsolutePath(), mark);   
  45.                    if(IndexReader.isLocked(fsd)){      //这   
  46.                        IndexReader.unlock(fsd);;   
  47.                       }   
  48.             IndexWriter writerF = new IndexWriter(fsd,new CJKAnalyzer());   
  49. //          RAMDirectory ramD = new RAMDirectory();   
  50. //          IndexWriter writerR = new IndexWriter(ramD,new StandardAnalyzer());   
  51.                
  52.                
  53.             con = DataConnectionPool.getBasicDataSource().getConnection();   
  54.             ps = con.prepareStatement(find,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);   
  55.             ResultSet rs  = ps.executeQuery();   
  56.             System.out.println(" start :"+start);   
  57.             rs.absolute(start);   
  58.             rs.previous();   
  59.             while(rs.next()&&num!=0)   
  60.             {   
  61.                 Document doc = new Document();   
  62.                 doc.add(new Field("id",rs.getString(1),Field.Store.YES, Field.Index.UN_TOKENIZED));   
  63.                 doc.add(new Field("content",rs.getString(2), Field.Store.YES,Field.Index.TOKENIZED ));   
  64.                 //writerR.optimize();   
  65.                 //writerR.addDocument(doc); 
  66.                 writerF.optimize(); 
  67.                 writerF.addDocument(doc);   
  68.                 num--;   
  69.             }   
  70. //          writerR.optimize();   
  71. //          writerR.close();           
  72.             writerF.close();               
  73. //          writerF.addIndexes(new Directory[]{ramD});   
  74.             Date endDate = new Date();   
  75.   
  76.             System.out.println("索引耗去的时间(毫秒) :"  
  77.                     + (endDate.getTime() - beginDate.getTime()));   
  78.                
  79.         } catch (IOException e) {   
  80.             // TODO Auto-generated catch block   
  81.             e.printStackTrace();   
  82.         } catch (SQLException e) {   
  83.             // TODO Auto-generated catch block   
  84.             e.printStackTrace();   
  85.         }   
  86.   
  87.     }   
  88.   
  89. }   
   发表时间:2007-06-02  
帖子没人关注啊 伤心个先 被投个隐藏的愿望都没能实现啊 呵呵 最近在网上听人说索引时间没什么办法来解决 只能在后台偷偷的运行  
0 请登录后投票
   发表时间:2007-06-06  
索引啊?我不懂,想帮忙也帮不上,呵呵!不过还是有人关注的吗
只是搞索引的人比例少点
0 请登录后投票
   发表时间:2007-08-21  
MM的照片能不能放大一点?
0 请登录后投票
   发表时间:2007-09-05  
我在删除索引的时候 出现 了这样的错误:

Lock obtain timed out: SimpleFSLock@D:\lucene\index\write.lock
0 请登录后投票
   发表时间:2007-09-05  
public void unDelete()throws Exception{
IndexReader reader = IndexReader.open(path);
reader.undeleteAll();
reader.close();
}
0 请登录后投票
   发表时间:2007-09-05  
public void unDelete()throws Exception{
IndexReader reader = IndexReader.open(path);
reader.undeleteAll(); // 这里出错了
reader.close();
}
0 请登录后投票
   发表时间:2007-09-05  
原来是没有 调用 IndexWriter 对象 中的 writer.optimize()方法
0 请登录后投票
   发表时间:2008-05-05  
这个问题估计是当给数据库某个行建立索引的时候,数据库某行被锁定或者根本这行就不存在(正在此时被删除了),就会造成这种现象。
解决办法,引入同步机制。
0 请登录后投票
   发表时间:2008-05-05  
估计是建立索引的时候这个行纪录不存在或者被锁定用来修改。
解决办法,引入同步机制。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics