lucene 创建 搜索 更新 删除

package fold1.lucene;

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

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class Test {

 /**
  * @param args
  * @throws Exception 
  */
    //要索引的文件目录
 String fileDir="D:\\pro\\excise\\WebRoot\\lucetest";
 //将索引文件保存的文件目录
 String indexDir="D:\\index";
 public static void main(String[] args) throws Throwable {
  // TODO Auto-generated method stub
        Test text=new Test();
        text.createSearch();
        text.search();
 }
    public void createSearch() throws Exception{
     //创建directory
      Directory dir =new SimpleFSDirectory(new File(indexDir));
        //创建分词器
      Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_30);
        //创建IndexWriter对象,第一个参数是Directory,第二个是分词器,第三个表示是否是创建,true创建新的索引,FALSE为追加索引,第四表示表示分词的最大值,比如说new MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED
      IndexWriter indexwrite=new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
        
      File[] files=new File(fileDir).listFiles();
      for(int i=0;i<files.length;i++){
       //创建Document对象
       Document doc=new Document();
       //创建filed对象  field 就行当予百度搜索出来的一条记录的中一个结构,标题 或者内容或者最后修改时间,而一个document就相当于一条记录
       Field field2=new Field("fileName" ,files[i].getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
       Field field1=new Field("content",new FileReader(files[i]));       
       Field field3=new Field("fileDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED);
       doc.add(field1);doc.add(field2);doc.add(field3);
       indexwrite.addDocument(doc);     
      }
      System.out.println("共建立:"+indexwrite.numDocs()+"条索引");
  //对于批量索引进行优化
   //indexwrite.optimize();
      indexwrite.close();
    }
    
    public void search() throws Throwable{
     //创建directory
      Directory dir =new SimpleFSDirectory(new File(indexDir));
      //创建indexSearcher 
      //创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了   
         IndexSearcher indexSearch = new IndexSearcher(dir); 
      //创建queryParse
         QueryParser queryparse=new QueryParser(Version.LUCENE_30, "content",new StandardAnalyzer(Version.LUCENE_30));
       //创建query对象 
         Query query =queryparse.parse("content:这是");
                    //下面边那种方式也可以用 不过局限于单个词,另外有类似于SQL的 Lucene 查询语句 可以在网上查询
        //Query q = new TermQuery(new Term("contents", "java"));   
       //返回符合条件的10条记录
       TopDocs hits=indexSearch.search(query, 10);
       System.out.println("一共搜到"+hits.totalHits);
       //搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值    
       //循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值   
           for (int i = 0; i < hits.scoreDocs.length; i++) {   
          ScoreDoc sdoc = hits.scoreDocs[i];   
           Document doc = indexSearch.doc(sdoc.doc);   
          System.out.println(doc.get("fileName"));   
          System.out.println(doc.get("content"));
         System.out.println(doc.get("fileDate"));
        }          
          indexSearch.close(); 
    }
}

 

以上代码是仿照别人的博客写的 ,以下是删除、更新   我没有写把原博客的给搬一下http://langhua9527.iteye.com/blog/582347

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值