1.Lucene实现全文检索的流程
由图可以看出,Lucene实现的全文检索核心就是索引库。索引就是为了快速查找而存在的,比如字典中的索引,关系型数据库中的索引。
Lucene的使用大概分为两个步骤:
- 获取文档,分析整理,写入索引库,索引库的存储位置可以自定义
- 从索引库中查询
2.代码
/**
* lucene索引管理器
*/
public class IndexManager {
private Directory directory;
//创建索引
public void createIndex(){
try {
//创建一个存储索引的目录,除此之外,索引还可以存储在内存中
directory= FSDirectory.open(new File("E:\\in"));
//创建一个标准的分析器
Analyzer analyzer=new StandardAnalyzer();
//支持中文的分析器
//Analyzer analyzer=new IKAnalyzer();
//创建IndexWriterConfig对象,第一个参数为Lucene版本信息,第二个参数为分析器对象
IndexWriterConfig config=new IndexWriterConfig(Version.LATEST,analyzer);
//创建IndexWriter对象
IndexWriter indexWriter=new IndexWriter(directory,config);
//读文件,这里测试的文件来源于硬盘,实际中可能来源于网络,数据库
File files=new File("E:\\Test");
for(File file:files.listFiles()){
//文件名
String fileName = file.getName();
//文件内容
String fileContent = FileUtils.readFileToString(file,"GBK");
//fileContent=new String(fileContent.getBytes("GBK"),"UTF-8");
//文件路径
String filePath = file.getPath();
//文件的大小
long fileSize = FileUtils.sizeOf(file);
//创建文件名域,每个文件都可以拆分为不同的域
//第一个参数:域的名称
//第二个参数:域的内容
//第三个参数:是否存储
Field fileNameField = new TextField("filename", fileName, Field.Store.YES);
//文件内容域
Field fileContentField = new TextField("content", fileContent, Field.Store.YES);
//文件路径域(不分析、不索引、只存储)
Field filePathField = new StoredField("path", filePath);
//文件大小域
Field fileSizeField = new LongField("size", fileSize, Field.Store.YES);
//创建document对象,
Document document = new Document();
document.add(fileNameField);
document.add(fileContentField);
document.add(filePathField);
document.add(fileSizeField);
//创建索引,并写入索引库
indexWriter.addDocument(document);
}
//提交创建内容
indexWriter.commit();
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//根据关键词进行搜索
public void searchIndex(){
try {
directory= FSDirectory.open(new File("E:\\in"));
//创建IndexReader对象
IndexReader indexReader= DirectoryReader.open(directory);
//创建IndexSearcher对象
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
//创建查询对象
Query query=new TermQuery(new Term("content","发票"));
//执行查询
//第一个参数是查询对象,第二个参数是查询结果返回的最大值
TopDocs topDocs = indexSearcher.search(query, 10);
//查询结果的总条数
System.out.println("查询结果的总条数:"+ topDocs.totalHits);
//遍历查询结果,scoreDoc 存储了document对象的id
for(ScoreDoc scoreDoc :topDocs.scoreDocs){
//根据document的id找到document对象
Document document = indexSearcher.doc(scoreDoc.doc);
System.err.println(document.get("filename"));
System.err.println(document.get("content"));
System.err.println(document.get("path"));
System.err.println(document.get("size"));
}
indexReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//删除全部索引
public void deleteAllIndex(IndexWriter indexWriter) throws Exception {
//删除全部索引
indexWriter.deleteAll();
//关闭indexwriter
indexWriter.close();
}
}
主方法
public class Main {
public static void main(String[] args) {
IndexManager manager=new IndexManager();
manager.createIndex();
manager.searchIndex();
}
}
:
项目中用到的jar包: