对lucene的学习之建立索引

需要lucene3.03.zip

先创建一个接口:

  1. package cn.net.persist.dao; 
  2.  
  3. import org.apache.lucene.analysis.Analyzer; 
  4. import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; 
  5. import org.apache.lucene.analysis.standard.StandardAnalyzer; 
  6. import org.apache.lucene.index.IndexWriter.MaxFieldLength; 
  7. import org.apache.lucene.util.Version; 
  8.  
  9.  
  10. public interface Constants { 
  11.      
  12.     public String FILE_DIR = "D:\\Workspaces\\MyEclipse 8.5\\luceneDemo\\dataSource";//文件存放的目录 
  13.     public String INDEX_DIR = "D:\\Workspaces\\MyEclipse 8.5\\luceneDemo\\index";   //索引存放的目录 
  14.      
  15.     static Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_30);// 中文采用该分词器 
  16.     static Analyzer enAnalyzer = new StandardAnalyzer(Version.LUCENE_30);// 英文采用该分词器 
  17.  
  18.     static Version version = Version.LUCENE_30;//Lucene版本 
  19.     static MaxFieldLength maxLength = MaxFieldLength.LIMITED;//Field的长度限制 

然后写一个工具类:

 

  1. package cn.net.persist.utils; 
  2.  
  3. import java.io.BufferedReader; 
  4. import java.io.File; 
  5. import java.io.FileInputStream; 
  6. import java.io.InputStreamReader; 
  7.  
  8. import org.apache.lucene.document.Document; 
  9. import org.apache.lucene.document.Field; 
  10. import org.apache.lucene.document.Field.Index; 
  11. import org.apache.lucene.document.Field.Store; 
  12.  
  13. public class File2DocumentUtils { 
  14.  
  15.  
  16.      
  17.  
  18.     /** 
  19.     * @param path 
  20.     */ 
  21.     public static Document file2Document(String path) { 
  22.        File file = new File(path); 
  23.  
  24.        Document doc = new Document(); 
  25.        doc.add(new Field("filename", file.getName(), Store.YES, Index.ANALYZED)); 
  26.        doc.add(new Field("contents", readFileContent(file), Store.YES, Index.ANALYZED)); 
  27.        doc.add(new Field("size", file.length() + "", Store.YES, Index.NOT_ANALYZED)); 
  28.        doc.add(new Field("path", file.getAbsolutePath(), Store.YES, Index.NOT_ANALYZED)); 
  29.  
  30.        return doc; 
  31.     } 
  32.  
  33.     /** 
  34.     * @param file 
  35.     */ 
  36.     public static Document file2Document(File file) throws Exception { 
  37.      
  38.        
  39.        Document doc = new Document(); 
  40.        doc.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.ANALYZED)); 
  41.        // doc.add(new Field("contents", new FileReader(f)));// that is not stored. 
  42.        doc.add(new Field("contents", readFileContent(file), Store.YES, Index.ANALYZED)); 
  43.        doc.add(new Field("size", file.length() + "", Field.Store.YES, Field.Index.NOT_ANALYZED)); 
  44.        
  45.        return doc; 
  46.     } 
  47.  
  48.     /** 
  49.     * 
  50.     * 获取 name 属性的值的两种方法: 
  51.     * 
  52.     * <pre> 
  53.     * 1,Field f = doc.getField(&quot;name&quot;); 
  54.     *      f.stringValue(); 
  55.     * 2,doc.get(&quot;name&quot;); 
  56.     * </pre> 
  57.     * 
  58.     * @param doc 
  59.     */ 
  60.     public static void printDocumentInfo(Document doc) { 
  61.        System.out.println("filename     = " + doc.get("filename")); 
  62.        System.out.println("contents = " + doc.get("contents")); 
  63.        System.out.println("size     = " + doc.getField("size")); 
  64.        System.out.println("path     = " + doc.getField("path")); 
  65.     } 
  66.  
  67.  
  68.     /** 
  69.     * 
  70.     * 读取文件内容 
  71.     * @param file 
  72.     */ 
  73.     public static String readFileContent(File file) { 
  74.        try { 
  75.         InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "gbk"); 
  76.         BufferedReader reader = new BufferedReader(inputStreamReader); 
  77.         StringBuffer content = new StringBuffer(); 
  78.         for (String line = null; (line = reader.readLine()) != null;) { 
  79.          content.append(line).append("\n"); 
  80.         } 
  81.         return content.toString(); 
  82.        } catch (Exception e) { 
  83.         throw new RuntimeException(e); 
  84.        } 
  85.     } 

最后写测试方法:

 

  1. package cn.net.persist.dir; 
  2.  
  3. import java.io.File; 
  4.  
  5. import org.apache.lucene.document.Document; 
  6. import org.apache.lucene.index.IndexWriter; 
  7. import org.apache.lucene.store.Directory; 
  8. import org.apache.lucene.store.FSDirectory; 
  9. import org.apache.lucene.store.RAMDirectory; 
  10. import org.junit.Test; 
  11.  
  12. import cn.net.persist.dao.Constants; 
  13. import cn.net.persist.utils.File2DocumentUtils; 
  14.  
  15. public class Directorys implements Constants{ 
  16.     private static String filePath = "D:\\Workspaces\\MyEclipse 8.5\\luceneDemo\\dataSource\\xiaoli.txt"
  17.      
  18.     /** 
  19.     * 把文件写入索引 
  20.     */ 
  21.     @Test 
  22.     public void test1() throws Exception { 
  23.        Directory fsDir = FSDirectory.open(new File(INDEX_DIR)); 
  24.        Document doc = File2DocumentUtils.file2Document(filePath); 
  25.  
  26.        // 写入索引 
  27.        IndexWriter indexWriter = new IndexWriter(fsDir, analyzer, maxLength); 
  28.        indexWriter.addDocument(doc); 
  29.  
  30.        // 优化索引 
  31.        indexWriter.optimize(); 
  32.        indexWriter.close(); 
  33.  
  34.        // 打印相关信息 
  35.        File2DocumentUtils.printDocumentInfo(doc); 
  36.     } 
  37.      
  38.      
  39.     /** 
  40.      * 把磁盘索引加载到内存当中读写 
  41.      */ 
  42.     @Test 
  43.     public void test2() throws Exception{ 
  44.         Directory fsDir =FSDirectory.open(new File(INDEX_DIR)); 
  45.         //1,设置启动时读取 
  46.         Directory ramDir = new RAMDirectory(fsDir); 
  47.         //2,运行程序是操作ramDir 
  48.         IndexWriter ramIndexWriter = new IndexWriter(ramDir,analyzer,maxLength); 
  49.         //添加Document 
  50.         Document doc = File2DocumentUtils.file2Document(filePath); 
  51.         ramIndexWriter.addDocument(doc); 
  52.         ramIndexWriter.close(); 
  53.         //4,把内存中的修改同步到磁盘文件 
  54.         IndexWriter fsIndexWriter = new IndexWriter(fsDir,analyzer,true,maxLength); 
  55.         fsIndexWriter.addIndexesNoOptimize(ramDir); 
  56.         fsIndexWriter.optimize();//优化 
  57.         fsIndexWriter.commit();//提交事务 
  58.         System.out.println("是否有删除="+fsIndexWriter.hasDeletions()); 
  59.         System.out.println("一共有="+fsIndexWriter.maxDoc()); 
  60.         System.out.println("还剩="+fsIndexWriter.numDocs()); 
  61.         fsIndexWriter.close(); 
  62.     } 
  63.      

测试成功,在控制台输出:

 

  1. filename     = xiaoli.txt 
  2. contents = 1 会员登陆没有验证码问题: 
  3.     因为在提交的时候代码没有对验证码处理,所以,当没有验证码的时候,也可以通过验证,进而实现登陆 
  4. 2 个人会员注册问题: 
  5.     注册会失败,因为没有验证码的原因,所以把验证码加上的时候,就可以实现会员的注册 
  6. 3 企业会员注册问题 
  7.     企业会员的注册可以放在个人会员的时候,让用户选择注册时个人会员还是企业会员,这样在action中稍加判断就可以实现个人和企业的注册, 
  8. 4 当登陆后台的时候,修改会员组的时候,会出现乱码问题,处理中 
  9.  
  10. size     = stored,indexed<size:437> 
  11. path     = stored,indexed<path:D:\Workspaces\MyEclipse 8.5\luceneDemo\dataSource\xiaoli.txt> 
  12. ------------------------------------------------ 
  13. 是否有删除=false 
  14. 一共有=13 
  15. 还剩=13
  16.  

哇,写完,收工,希望大家能学到东西!

 

(因附件大过4m,没能上传成功,需要的给我要)