根据文档创建索引案例:
public void createIndex() throws Exception {
//创建IndexWriter对象
Directory directory = FSDirectory.open(Paths.get("D:\\lucene-7.6.0\\BlackTv_demo", new String[0]));
Analyzer analyzer = new StandardAnalyzer();//StandardAnalyzer是官方推荐的,所以对中文肯定没支持,中文支持的后面再说
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
File folder = new File("D:\\lucene-7.6.0\\BlackTv_demo\\demo");//获取文件夹
File[] fileList = folder.listFiles();//获取该文件夹下文件列表
for (File file : fileList) {
//创建field域,这里创建4个:文件名称、文件大小、文件路径、文件名称,只分析文件名和内容,大小和路径分析了也没意义
Field fileNameField = new TextField("fileName", file.getName(), Field.Store.YES);
long fileSize = FileUtils.sizeOf(file);//文件大小的field做不了,lucene 7.6.0找不到LongField
Field filePathField = new StoredField("filePath", file.getPath());
Field fileContentField = new TextField("fileContent", FileUtils.readFileToString(file), Field.Store.YES);
//创建Document对象,将field添加到文档里,一个文件一个文档
Document document = new Document();
document.add(fileNameField);
document.add(filePathField);
document.add(fileContentField);
//将文档对象存储到索引库
indexWriter.addDocument(document);
}
indexWriter.close();//关闭indexWriter流
}
生成索引后,在索引目录里会有索引文件,可以通过Luck这个工具来查看https://github.com/DmitryKey/luke/releases #下载和Lucene相同版本的、
有IndexSearcher的方法看出可以写分页查询,补充一个IndexSearcher的方法
int maxDoc() #返回比最大可能的文档数目多一个
查询案例,查询关键字为apache:
public void Search() throws Exception {
//创建Directory对象,打开索引库的位置
Directory directory = FSDirectory.open(Paths.get("D:\\lucene-7.6.0\\BlackTv_demo", new String[0]));
//创建IndexReader对象,打开索引库
IndexReader indexReader = DirectoryReader.open(directory);
//创建IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//创建查询对象,查询域为文件内容,关键字为apache
Query query = new TermQuery(new Term("fileContent", "apache"));
//执行查询,查询term出现频率最高的前3
TopDocs topDocs = indexSearcher.search(query, 3);
//获取查询结果,遍历打印
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
System.out.println("文档id:" + scoreDoc.doc);
//根据文档id获取文档对象
Document document = indexSearcher.doc(scoreDoc.doc);
System.out.println("文件名:" + document.get("fileName"));
System.out.println("文件路径:" + document.get("filePath"));
// System.out.println("文件内容:" + document.get("fileContent"));//内容太多就不打印出来了
System.out.println("----------------------------------------------------------------------------------");
System.out.println("----------------------------------------------------------------------------------");
}
//关闭流
indexReader.close();
}