Lucene学习笔记(一)

200782502.jpg

建立索引:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;

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;

public   class  Indexer 
{
    
// 建立索引
     /* *
     * @param args
     
*/
    
public   static   void  main(String[] args) throws Exception
    {
        
//  TODO Auto-generated method stub
         if  (args.length  !=   2 )
        { 
             
throw   new  Exception( " Usage: java "   +  Indexer. class .getName() +   " <index dir> <data dir> " ); 
        } 
        File indexDir 
=   new  File(args[ 0 ]); // 存放索引的路径
        File dataDir  =   new  File(args[ 1 ]);  // 要建立索引的目录路径
         long  start  =   new  Date().getTime(); 
        
int  numIndexed  =  index(indexDir, dataDir);  // 建立索引
         long  end  =   new  Date().getTime(); 
        System.
out .println( " Indexing  "   +  numIndexed  +   "  files took  "   +  (end  -  start)  +   "  milliseconds " ); 
    }

    
private   static   int  index(File indexDir, File dataDir) throws IOException 
    { 
         
if  ( ! dataDir.exists()  ||   ! dataDir.isDirectory()) 
         { 
            
throw   new  IOException(dataDir +   "  does not exist or is not a directory " ); 
         }
         IndexWriter writer 
=   new  IndexWriter(indexDir,  new  StandardAnalyzer(),  true ); 
         writer.setUseCompoundFile(
false ); 
         indexDirectory(writer, dataDir); 
         
int  numIndexed  =  writer.docCount(); 
         writer.optimize(); 
         writer.close(); 
         
return  numIndexed; 
    }

    
private   static   void  indexDirectory(IndexWriter writer, File dataDir)  throws IOException
    {
        
//  TODO Auto-generated method stub
         File[] files  =  dataDir.listFiles(); 
         
for  ( int  i  =   0 ; i  <  files.length; i ++ )
         { 
             File f 
=  files[i]; 
             
if  (f.isDirectory()) 
             { 
                 indexDirectory(writer, f); 
             } 
             
else   if  (f.getName().endsWith( " .txt " )) 
             { 
                 indexFile(writer, f); 
             } 
         } 
    }

    
private   static   void  indexFile(IndexWriter writer, File f) throws IOException 
    { 
         
if  (f.isHidden()  ||   ! f.exists()  ||   ! f.canRead()) 
         { 
             
return
         } 
         System.
out .println( " Indexing  "   +  f.getCanonicalPath()); 
         Document doc 
=   new  Document(); 
         doc.add(
new  Field( " contents " new  FileReader(f)));
         doc.add(
new  Field( " filename " , f.getCanonicalPath(), Field.Store.YES, Field.Index.TOKENIZED));
         writer.addDocument(doc);
        
    }

}

搜索:
import java.io.File;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;


public   class  Searcher
{

    
/* *
     * @param args
     
*/
    
public   static   void  main(String[] args) throws Exception 
    { 
         
if  (args.length  !=   2 )
         { 
             
throw   new  Exception( " Usage: java  "   +  Searcher. class .getName() +   "  <index dir> <auery> " ); 
         } 
         File indexDir 
=   new  File(args[ 0 ]); // 要搜索的索引所在目录
         String q  =  args[ 1 ];  // 搜索关键字
          if  ( ! indexDir.exists()  ||   ! indexDir.isDirectory()) 
         { 
             
throw   new  Exception(indexDir  +   "  does not exist or is not a directory. " ); 
         } 
         search(indexDir, q); 
    }

    
private   static   void  search(File indexDir, String q) throws Exception 
    { 
         Directory fsDir 
=  FSDirectory.getDirectory(indexDir,  false ); 
         IndexSearcher 
is   =   new  IndexSearcher(fsDir); //  打开索引
         QueryParser parser  =   new  QueryParser( " contents " new  StandardAnalyzer());

         Query query 
=  parser.parse(q);  // 对文本内容进行分析查询  
          long  start  =   new  Date().getTime(); 
         Hits hits 
=   is .search(query);  // 搜索索引 
          long  end  =   new  Date().getTime(); 
         System.err.println(
" Found  "   +  hits.length()  +   "  document(s) (in  "   +  (end  -  start)  +    "  milliseconds) that matched query ' "   +  q  +   " ’: " ); 
         
for  ( int  i  =   0 ; i  <  hits.length(); i ++ )
         { 
             Document doc 
=  hits.doc(i);  // 得到匹配的文档 
             System. out .println(doc. get ( " filename " )); 
         } 
    }

}

重点学习的几个方面:

1,              Lucene的索引结构,

2,              各种异构数据源的解析器(Parser

3,              分词器(Analyzer)提取索引项(尤其是如何进行中文分词)

注:这里使用的是lucene2.2.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值