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