上一节只介绍了Lucene的整体流程。和构建文档对象。至于分词时怎么分的?查询是怎么查的?如何与域联系起来…等更多细节和底层原理。后续介绍,因为更抽象,难懂。等到代码学习之后, 再看,容易一些。
为了简单操作和方便易懂,继续使用场景一作为案例:(以下代码,先运行成功。后面会逐步讲解)
需求:
通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来:下图(是一堆文件列表)
本人使用:
版本与环境:
lucene4.10.3
Jdk:1.7(Jdk要求:1.7以上)
IDE:Eclipse
建工程,导包(前面说过Lucene就是一堆jar包):
代码:
步骤一:创建索引
@Test
public void run() throws IOException{
//索引库存放的位置
Directory directory = FSDirectory.open(new File("G:\\a\\v"));
Analyzer analyzer=new StandardAnalyzer();//标准的分词器
IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
//创建field域
File f = new File("G:\\a\\新建文件夹");
// listFiles 就是那一堆要搜索的文件
File[] listFiles = f.listFiles();
for (File file : listFiles) {
//创建文档对象
Document document = new Document();
// 文件名称
String file_name = file.getName();
Field fileNameField = new TextField("fileName", file_name, Store.YES);
// 文件大小
long file_size = FileUtils.sizeOf(file);
Field fileSizeField = new LongField("fileSize", file_size, Store.YES);
// 文件路径
String file_path = file.getPath();
Field filePathField = new StoredField("filePath", file_path);
// 文件内容
String file_content = FileUtils.readFileToString(file);
Field fileContentField = new TextField("fileContent", file_content, Store.NO);
document.add(fileNameField);
document.add(fileSizeField);
document.add(filePathField);
document.add(fileContentField);
//扔进索引库
indexWriter.addDocument(document);
}
indexWriter.close();
}
//=========================================================================运行程序后:
那么则说明创建索引成功:整个程序就是实现了创建索引
//==========================================
步骤二:查询索引
// 查询索引
@Test
public void testSearchIndex() throws Exception {
// 第一步:查询准备工作
// 创建Directory对象
Directory dir = FSDirectory.open(new File("G:\\a\\v"));
// 创建IndexReader对象
IndexReader reader = DirectoryReader.open(dir);
// 创建IndexSearcher对象
IndexSearcher searcher = new IndexSearcher(reader);
// 第二步:创建查询条件对象
TermQuery query = new TermQuery(new Term("fileName", "spring.txt"));
// 第三步:执行查询(参数1:查询条件对象,参数2:查询结果返回的最大值)
TopDocs topDocs = searcher.search(query, 10);
// 第四步:处理查询结果
// 输出结果数量
System.out.println("查询的结果数量:" + topDocs.totalHits);
// 取得结果集
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 遍历结果集
for (ScoreDoc scoreDoc : scoreDocs) {
// 根据文档对象ID取得文档对象
Document doc = searcher.doc(scoreDoc.doc);
// 打印搜索结果内容
// 文件名称
System.out.println("文件名称:" + doc.get("fileName"));
// 文件路径
System.out.println("文件路径:" + doc.get("filePath"));
// 文件大小
System.out.println("文件大小:" + doc.get("fileSize"));
}
// 关闭IndexReader对象
reader.close();
}
运行结果:
通过以上的两段代码我们实现了创建索引与查询索引。
第一段代码做了这么几个事:
将我们要查询的每个文档,构建了了文档对象。文档对象里面存放的就是该文档的信息。(文件名,大小,内容,路径等)
将该文档对象扔进索引库(自动创建了索引)
索引库存放在G:\a\v 目录下
第二段代码:
就是到索引库的目录下 找fileName 为:spring.txt的文档。然后输出了该文档的信息。