[转]Lucene 2 教程

系统 1767 0

Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。 其功能非常的强大,api也很简单。总得来说用Lucene来进行建立 和搜索和操作数据库是差不多的(有点像),Document可以看作是 数据库的一行记录,Field可以看作是数据库的字段。用lucene实 现搜索引擎就像用JDBC实现连接数据库一样简单。

Lucene2.0,它与以前广泛应用和介绍的Lucene 1.4.3并不兼容。 Lucene2.0的下载地址是 http://apache.justdn.org/lucene/java/


例子一 :

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

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

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

2、下载lucene包,放在classpath路径中 
建立索引:

  package    lighter.iteye.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;   
    }
 
   
}
 
 

索引的结果:

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


3、建立了索引之后,查询啦....

  package    lighter.iteye.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    个结果   !

 

Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索 
来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。

IndexWriter :lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

Analyzer :分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory :索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。

Document :文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

Field :字段。

IndexSearcher :是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;

Query :查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

QueryParser : 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

Hits :在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。

上面作了一大堆名词解释,下面就看几个简单的实例吧: 
1、简单的的StandardAnalyzer测试例子

 

  package    lighter.iteye.com;   
  
  import    java.io.IOException;   
  import    java.io.StringReader;   
  
  import    org.apache.lucene.analysis.Analyzer;   
  import    org.apache.lucene.analysis.Token;   
  import    org.apache.lucene.analysis.TokenStream;   
  import    org.apache.lucene.analysis.standard.StandardAnalyzer;   
  
  public       class    StandardAnalyzerTest    
  {   
    
  //   构造函数,     
 
       public    StandardAnalyzerTest()   
    
  {   
    }
 
   
    
  public       static       void    main(String[] args)    
    
  {   
        
  //   生成一个StandardAnalyzer对象     
 
        Analyzer aAnalyzer    =       new    StandardAnalyzer();   
        
  //   测试字符串     
 
        StringReader sr    =       new    StringReader(   "   lighter javaeye com is the are on   "   );   
        
  //   生成TokenStream对象     
 
        TokenStream ts    =    aAnalyzer.tokenStream(   "   name   "   , sr);    
        
  try       {   
            
  int    i   =   0   ;   
            Token t 
  =    ts.next();   
            
  while   (t   !=   null   )   
            
  {   
                
  //   辅助输出时显示行号     
 
                i   ++   ;   
                
 
<
分享到:
评论

[转]Lucene 2 教程


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论