• lucene的简单实例<一>
    时间:2008-12-01   作者:佚名   出处:互联网

    说明一下,这一篇文章的用到的lucene,是用2.0版本的,主要在查询的时候2.0版本的lucene与以前的版本有了一些区别. 其实这一些代码都是早几个月写的,自己很懒,所以到今天才写到自己的博客上,高深的文章自己写不了,只能记录下一些简单的记录与点滴,其中的代码算是自娱自乐的,希望高手不要把重构之类的砸下来...

    1、在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件,随便起名啦,就叫"1.txt","2.txt"和"3.txt"啦
    其中1.txt的内容如下:
    Java代码 复制代码

       1. 中华人民共和国 
       2. 全国人民 
       3. 2006年 

    中华人民共和国
    全国人民
    2006年


    而"2.txt"和"3.txt"的内容也可以随便写几写,这里懒写,就复制一个和1.txt文件的内容一样吧

    2、下载lucene包,放在classpath路径中
    建立索引:
    Java代码 复制代码

       1. package lighter.javaeye.com; 
       2.  
       3. import java.io.BufferedReader; 
       4. import java.io.File; 
       5. import java.io.FileInputStream; 
       6. import java.io.IOException; 
       7. import java.io.InputStreamReader; 
       8. import java.util.Date; 
       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.Field; 
      14. import org.apache.lucene.index.IndexWriter; 
      15.  
      16. /**
      17.  * author lighter date 2006-8-7
      18.  */ 
      19. public class TextFileIndexer { 
      20.     public static void main(String[] args) throws Exception { 
      21.         /* 指明要索引文件夹的位置,这里是C盘的S文件夹下 */ 
      22.         File fileDir = new File("c:\\s"); 
      23.  
      24.         /* 这里放索引文件的位置 */ 
      25.         File indexDir = new File("c:\\index"); 
      26.         Analyzer luceneAnalyzer = new StandardAnalyzer(); 
      27.         IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, 
      28.                 true); 
      29.         File[] textFiles = fileDir.listFiles(); 
      30.         long startTime = new Date().getTime(); 
      31.          
      32.         //增加document到索引去 
      33.         for (int i = 0; i < textFiles.length; i++) { 
      34.             if (textFiles[i].isFile() 
      35.                     && textFiles[i].getName().endsWith(".txt")) { 
      36.                 System.out.println("File " + textFiles[i].getCanonicalPath() 
      37.                         + "正在被索引...."); 
      38.                 String temp = FileReaderAll(textFiles[i].getCanonicalPath(), 
      39.                         "GBK"); 
      40.                 System.out.println(temp); 
      41.                 Document document = new Document(); 
      42.                 Field FieldPath = new Field("path", textFiles[i].getPath(), 
      43.                         Field.Store.YES, Field.Index.NO); 
      44.                 Field FieldBody = new Field("body", temp, Field.Store.YES, 
      45.                         Field.Index.TOKENIZED, 
      46.                         Field.TermVector.WITH_POSITIONS_OFFSETS); 
      47.                 document.add(FieldPath); 
      48.                 document.add(FieldBody); 
      49.                 indexWriter.addDocument(document); 
      50.             } 
      51.         } 
      52.         //optimize()方法是对索引进行优化 
      53.         indexWriter.optimize(); 
      54.         indexWriter.close(); 
      55.          
      56.         //测试一下索引的时间 
      57.         long endTime = new Date().getTime(); 
      58.         System.out 
      59.                 .println("这花费了" 
      60.                         + (endTime - startTime) 
      61.                         + " 毫秒来把文档增加到索引里面去!" 
      62.                         + fileDir.getPath()); 
      63.     } 
      64.  
      65.     public static String FileReaderAll(String FileName, String charset) 
      66.             throws IOException { 
      67.         BufferedReader reader = new BufferedReader(new InputStreamReader( 
      68.                 new FileInputStream(FileName), charset)); 
      69.         String line = new String(); 
      70.         String temp = new String(); 
      71.          
      72.         while ((line = reader.readLine()) != null) { 
      73.             temp += line; 
      74.         } 
      75.         reader.close(); 
      76.         return temp; 
      77.     } 
      78. } 

    package lighter.javaeye.com;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Date;

    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.index.IndexWriter;

    /**
     * author lighter date 2006-8-7
     */
    public class TextFileIndexer {
        public static void main(String[] args) throws Exception {
            /* 指明要索引文件夹的位置,这里是C盘的S文件夹下 */
            File fileDir = new File("c:\\s");

            /* 这里放索引文件的位置 */
            File indexDir = new File("c:\\index");
            Analyzer luceneAnalyzer = new StandardAnalyzer();
            IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,
                    true);
            File[] textFiles = fileDir.listFiles();
            long startTime = new Date().getTime();
           
            //增加document到索引去
            for (int i = 0; i < textFiles.length; i++) {
                if (textFiles[i].isFile()
                        && textFiles[i].getName().endsWith(".txt")) {
                    System.out.println("File " + textFiles[i].getCanonicalPath()
                            + "正在被索引....");
                    String temp = FileReaderAll(textFiles[i].getCanonicalPath(),
                            "GBK");
                    System.out.println(temp);
                    Document document = new Document();
                    Field FieldPath = new Field("path", textFiles[i].getPath(),
                            Field.Store.YES, Field.Index.NO);
                    Field FieldBody = new Field("body", temp, Field.Store.YES,
                            Field.Index.TOKENIZED,
                            Field.TermVector.WITH_POSITIONS_OFFSETS);
                    document.add(FieldPath);
                    document.add(FieldBody);
                    indexWriter.addDocument(document);
                }
            }
            //optimize()方法是对索引进行优化
            indexWriter.optimize();
            indexWriter.close();
           
            //测试一下索引的时间
            long endTime = new Date().getTime();
            System.out
                    .println("这花费了"
                            + (endTime - startTime)
                            + " 毫秒来把文档增加到索引里面去!"
                            + fileDir.getPath());
        }

        public static String FileReaderAll(String FileName, String charset)
                throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(FileName), charset));
            String line = new String();
            String temp = new String();
           
            while ((line = reader.readLine()) != null) {
                temp += line;
            }
            reader.close();
            return temp;
        }
    }



    索引的结果:
    Java代码 复制代码

       1. File C:\s\1.txt正在被索引.... 
       2. 中华人民共和国全国人民2006年 
       3. File C:\s\2.txt正在被索引.... 
       4. 中华人民共和国全国人民2006年 
       5. File C:\s\3.txt正在被索引.... 
       6. 中华人民共和国全国人民2006年 
       7. 这花费了297 毫秒来把文档增加到索引里面去!c:\s 

    File C:\s\1.txt正在被索引....
    中华人民共和国全国人民2006年
    File C:\s\2.txt正在被索引....
    中华人民共和国全国人民2006年
    File C:\s\3.txt正在被索引....
    中华人民共和国全国人民2006年
    这花费了297 毫秒来把文档增加到索引里面去!c:\s



    3、建立了索引之后,查询啦....
    Java代码 复制代码

       1. package lighter.javaeye.com; 
       2.  
       3. import java.io.IOException; 
       4.  
       5. import org.apache.lucene.analysis.Analyzer; 
       6. import org.apache.lucene.analysis.standard.StandardAnalyzer; 
       7. import org.apache.lucene.queryParser.ParseException; 
       8. import org.apache.lucene.queryParser.QueryParser; 
       9. import org.apache.lucene.search.Hits; 
      10. import org.apache.lucene.search.IndexSearcher; 
      11. import org.apache.lucene.search.Query; 
      12.  
      13. public class TestQuery { 
      14.     public static void main(String[] args) throws IOException, ParseException { 
      15.         Hits hits = null; 
      16.         String queryString = "中华"; 
      17.         Query query = null; 
      18.         IndexSearcher searcher = new IndexSearcher("c:\\index"); 
      19.  
      20.         Analyzer analyzer = new StandardAnalyzer(); 
      21.         try { 
      22.             QueryParser qp = new QueryParser("body", analyzer); 
      23.             query = qp.parse(queryString); 
      24.         } catch (ParseException e) { 
      25.         } 
      26.         if (searcher != null) { 
      27.             hits = searcher.search(query); 
      28.             if (hits.length() > 0) { 
      29.                 System.out.println("找到:" + hits.length() + " 个结果!"); 
      30.             } 
      31.         } 
      32.     } 
      33.  
      34. } 

    package lighter.javaeye.com;

    import java.io.IOException;

    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.queryParser.ParseException;
    import org.apache.lucene.queryParser.QueryParser;
    import org.apache.lucene.search.Hits;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;

    public class TestQuery {
        public static void main(String[] args) throws IOException, ParseException {
            Hits hits = null;
            String queryString = "中华";
            Query query = null;
            IndexSearcher searcher = new IndexSearcher("c:\\index");

            Analyzer analyzer = new StandardAnalyzer();
            try {
                QueryParser qp = new QueryParser("body", analyzer);
                query = qp.parse(queryString);
            } catch (ParseException e) {
            }
            if (searcher != null) {
                hits = searcher.search(query);
                if (hits.length() > 0) {
                    System.out.println("找到:" + hits.length() + " 个结果!");
                }
            }
        }

    }



    其运行结果:
    引用
    找到:3 个结果!

    具体的API的用法,这里就不说了,具体的做法参考lucene的官方文档吧...

    网友留言/评论

    我要留言/评论