Lucene

转自 http://mybar.iteye.com/blog/1933351

今天看了下Lucene的更新,已经到4.4.0的版本了,而且新的API变化也比较多,对于老版本的Lucene想要升级到最新的版本,不是简单的更新jar包就可以的。

    下面写了个简单的小例子。可以看一下

 

1.创建maven工程

    在eclipse里面创建个maven项目,一个简单的项目即可,下面是对于的pom.xml文件,需要将Lucene的jar包引入进来。

Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <groupId>com.jacksoft</groupId>  
  4.   <artifactId>Lucene-test</artifactId>  
  5.   <version>0.0.1-SNAPSHOT</version>  
  6.     
  7.   <properties>  
  8.     <lucene.version>4.4.0</lucene.version>  
  9.   </properties>  
  10.     
  11.   <dependencies>  
  12.     <dependency>  
  13.         <groupId>org.apache.lucene</groupId>  
  14.         <artifactId>lucene-core</artifactId>  
  15.         <version>${lucene.version}</version>  
  16.     </dependency>  
  17.       
  18.     <dependency>  
  19.         <groupId>org.apache.lucene</groupId>  
  20.         <artifactId>lucene-analyzers-common</artifactId>  
  21.         <version>${lucene.version}</version>  
  22.     </dependency>  
  23.       
  24.     <dependency>  
  25.         <groupId>org.apache.lucene</groupId>  
  26.         <artifactId>lucene-queryparser</artifactId>  
  27.         <version>${lucene.version}</version>  
  28.     </dependency>  
  29.               
  30.               
  31.               
  32.   </dependencies>  
  33.     
  34. </project>  

   这里只是简单的添加依赖关系,下载好jar包之后,我在本地创建了3个txt文件,如下:

  

  

 准备工作就差不多了,下面就开始进行编码工作

 

2. 编码

    由于是多个文件的搜索,这里创建一个工具类来递归目录,找到这三个txt文件,我将这三个txt文件放在本地:D:\lucene\luceneData目录中

   

Java代码  收藏代码
  1. package com.jacksoft.lucene.util;  
  2.   
  3. import java.io.File;  
  4. import java.util.List;  
  5.   
  6. public class FileUtils {  
  7.   
  8.     public static void listFile(File f,List<String> fileList){  
  9.         if(f.isDirectory()){  
  10.             File[] files = f.listFiles();  
  11.             for(int i=0;i<files.length ;i++)  
  12.             {  
  13.                 listFile(files[i],fileList) ;  
  14.             }  
  15.         }else{  
  16.             fileList.add(f.getAbsolutePath());  
  17.         }  
  18.     }  
  19. }  

    这样返回的fileList中就包含了我们需要的txt文件,当然这里还可以设置过滤器来指定后缀名。

  接下来就是创建索引和查询的过程:

 

Java代码  收藏代码
  1. package com.jacksoft.lucene;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import org.apache.lucene.analysis.Analyzer;  
  11. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  12. import org.apache.lucene.document.Document;  
  13. import org.apache.lucene.document.TextField;  
  14. import org.apache.lucene.document.Field.Store;  
  15. import org.apache.lucene.index.DirectoryReader;  
  16. import org.apache.lucene.index.IndexReader;  
  17. import org.apache.lucene.index.IndexWriter;  
  18. import org.apache.lucene.index.IndexWriterConfig;  
  19. import org.apache.lucene.index.IndexWriterConfig.OpenMode;  
  20. import org.apache.lucene.queryparser.classic.QueryParser;  
  21. import org.apache.lucene.search.IndexSearcher;  
  22. import org.apache.lucene.search.Query;  
  23. import org.apache.lucene.search.ScoreDoc;  
  24. import org.apache.lucene.search.TopDocs;  
  25. import org.apache.lucene.store.Directory;  
  26. import org.apache.lucene.store.FSDirectory;  
  27. import org.apache.lucene.util.Version;  
  28.   
  29. import com.jacksoft.lucene.util.FileUtils;  
  30.   
  31. /** 
  32.  *  多文件搜索 
  33.  * @Project Lucene-test 
  34.  * 
  35.  * @Filename MultLuceneTest2.java 
  36.  * 
  37.  * @author Jack.Zhou 
  38.  * 
  39.  * @Date 2013-8-29 
  40.  * 
  41.  */  
  42. public class LuceneTest {  
  43.   
  44.     private static final String QUERY_STR = "四川";  
  45.       
  46.     private static final String FILE_TARGET = "D:\\lucene\\luceneData";  
  47.       
  48.     private static final String FILE_INDEX = "D:\\lucene\\luceneIndex";  
  49.       
  50.       
  51.     public static void main(String[] args) {  
  52.         try {  
  53.             LuceneTest t = new LuceneTest();  
  54.             t.createIndex();  
  55.             t.searchByKeyWords(QUERY_STR);  
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.     }  
  60.       
  61.     /** 
  62.      *  创建索引 
  63.      * @throws Exception 
  64.      */  
  65.     private void createIndex() throws Exception{  
  66.         Long startTime = System.currentTimeMillis();  
  67.         File indexDir = new File(FILE_INDEX);  
  68.         Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_44);  
  69.         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, luceneAnalyzer);  
  70.         config.setOpenMode(OpenMode.CREATE);  
  71.         Directory directory = FSDirectory.open(indexDir);  
  72.         IndexWriter indexWriter = new IndexWriter(directory, config);  
  73.         List<String> fileList = new ArrayList<String>();  
  74.         FileUtils.listFile(new File(FILE_TARGET), fileList);  
  75.         for(String filePath : fileList){  
  76.             System.out.println("文件:" + filePath + "正在被索引....");  
  77.             String content = readFile(filePath);  
  78.             Document doc = new Document();  
  79.             doc.add(new TextField("content", content.toString(), Store.YES));  
  80.             doc.add(new TextField("path", filePath, Store.YES));  
  81.             indexWriter.addDocument(doc);  
  82.         }  
  83.         indexWriter.close();  
  84.         Long endTime = System.currentTimeMillis();  
  85.         System.out.println("花费了" + (endTime - startTime) + "毫秒来创建索引文件");  
  86.           
  87.     }  
  88.     /** 
  89.      *  读取文件内容 
  90.      * @param filePath 
  91.      * @return 
  92.      * @throws Exception 
  93.      */  
  94.     private String readFile(String filePath) throws Exception{  
  95.         @SuppressWarnings("resource")  
  96.         BufferedReader bufferedReader = new BufferedReader(  
  97.                 new InputStreamReader(new FileInputStream(filePath)));  
  98.         StringBuffer content = new StringBuffer();  
  99.         String str = null;  
  100.         while ((str = bufferedReader.readLine()) != null) {  
  101.             content.append(str).append("\n");  
  102.         }  
  103.         return content.toString();  
  104.     }  
  105.       
  106.       
  107.     private void searchByKeyWords(String keyWords) throws Exception{  
  108.         IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(FILE_INDEX)));  
  109.         IndexSearcher searcher = new IndexSearcher(reader);  
  110.         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);  
  111.         QueryParser parser = new QueryParser(Version.LUCENE_44, "content",analyzer);  
  112.         Query query = parser.parse(keyWords);  
  113.         TopDocs results = searcher.search(query,1000);  
  114.         ScoreDoc[] score = results.scoreDocs;  
  115.         if (score.length == 0) {  
  116.             System.out.println("对不起,没有找到您要的结果。");  
  117.         } else {  
  118.             System.out.println("查找["+QUERY_STR+"]有" + score.length + "个结果");  
  119.             for (int i = 0; i < score.length; i++) {  
  120.                 try {  
  121.                     Document doc = searcher.doc(score[i].doc);  
  122.                     System.out.print("这是第" + i + "个检索到的结果,文件名为:");  
  123.                     System.out.println(doc.get("path"));  
  124.                     System.out.println("内容:\n" + doc.get("content"));  
  125.                 } catch (Exception e) {  
  126.                     e.printStackTrace();  
  127.                 }  
  128.             }  
  129.         }  
  130.     }  
  131. }  

 

   代码中的常量可以通过文档来查看,运行后就可以看到搜索的结果了。

 

   当然这里只是对txt进行搜索,你还可以对word,excel,pdf等文档进行搜索,前提是要将其内容读取出来,创建索引即可。

posted @ 2013-09-02 20:24  梦神十夜  阅读(321)  评论(0编辑  收藏  举报