Lucene创建索引和搜索示例
引入的pom文件可以自己去maven中央仓库获取
创建索引和搜索代码
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import java.io.File;
import java.io.FileReader;
/**
* 创建索引和搜索
* Created by Administrator on 14-3-12.
*/
public class HelloLucenes {
/**
* 创建索引
*/
public void createIndex(){
try
{
//1.创建Directory
Directory directory=FSDirectory.open(new File("d:/lucene/index0"));
//2.创建IndexWriter
IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_47, new StandardAnalyzer(Version.LUCENE_47));
IndexWriter writer=new IndexWriter(directory,iwc);
//3.创建Document对象
Document document=null;
//4.为Document添加Field
File file=new File("d:/lucene/data");
for(File f:file.listFiles())
{
document=new Document();
document.add(new StringField("path", f.getAbsolutePath(), Field.Store.YES));
document.add(new StringField("filename",f.getName(), Field.Store.YES));
document.add(new TextField("content",new FileReader(f)));
//5.通过IndexWriter添加文档到索引中
writer.addDocument(document);
}
writer.close();
}catch (Exception ex)
{
ex.printStackTrace();
}
}
/**
* 创建搜索
*/
public void createSearch()
{
try{
//1、创建Directory
Directory directory= FSDirectory.open(new File("d:/lucene/index0"));
//2、创建IndexReader
IndexReader reader=DirectoryReader.open(directory);
//3、根据IndexReader创建IndexSearch
IndexSearcher searcher=new IndexSearcher(reader);
//4、创建搜索的Query(赤岸感觉Parser来去顶要搜索的文件的内容,第二个参数标示搜索的域)
QueryParser parser=new QueryParser(Version.LUCENE_47,"content",new StandardAnalyzer(Version.LUCENE_47));
Query query=parser.parse("father");
//5、根据search搜索并且返回TopDocs
TopDocs tds=searcher.search(query,10);
//6、根据TOpDocs获取ScoreDoc对象
ScoreDoc[] sds=tds.scoreDocs;
for(ScoreDoc sd:sds)
{
//6、根据search和ScordDoc对象获取具体的Document对象
Document d=searcher.doc(sd.doc);
//8、根据Document对象获取需要的值
System.out.println(d.get("filename")+"["+d.get("path")+"]");
}
//9、关闭reader
reader.close();
}catch (Exception ex){}
}
}
创建测试类代码
import org.junit.Test;
/**
* 单元测试类
* Created by Administrator on 14-3-12.
*/
public class HelloLucenesTest {
@Test
public void hello(){
HelloLucenes hl=new HelloLucenes();
hl.createIndex();
}
@Test
public void search(){
HelloLucenes hl=new HelloLucenes();
hl.createSearch();
}
}
使用lucene4.7.0版本创建索引和查询功能,创建索引过程中使用StringField,创建完成后怎么也查询不出内容,结果最后发现StringField的默认构造函数不会分词,所以换成TextField类就可以了。TextField类默认构造函数会分词
----EOF-----