一 概述
程序是顺序执行执行的,想要尽快搞懂代码的编写逻辑,最好顺序看看代码,找到核心对象。
二 实例
1. 创建索引库(为每个文件)
逻辑:核心对象 indexWriter (索引存储路径,分析器配置)
File对象 (要分析的文件)
创建Field对象, (域名,域内容,是否存储)
创建document对象,document.add(field)
indexWriter.add(document) 加入索引库
2. 查询索引库
逻辑:核心对象 indexSearcher
创建term对象 术语 (域名,关键字)
创建query对象 TermQuery(term)
indexSearcher.search(query,结果设置)
获得
1.代码
建立索引库
package com.blueSky.lucene;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
public class MySnippet {
@Test
public void createIndex() throws Exception{
FSDirectory directory = FSDirectory.open(new File("F:\\temp\\index")); //创建索引目录位置
StandardAnalyzer analyzer = new StandardAnalyzer(); //创建一个标准分析器
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
//创建idexWriter对象
IndexWriter indexWriter = new IndexWriter(directory, config);
//文件对象
File file = new File("F:\\lucene_example\\全文检索.txt");
String fileName = file.getName();
String path = file.getPath();
String fileContent = FileUtils.readFileToString(file);
long size = FileUtils.sizeOf(file);
//创建Field对象
Field field_fileName = new TextField("fileName",fileName,Store.YES);
Field field_filePath = new StoredField("filePath",path); //不分析,不索引,只存储(storedField)
Field field_fileSize = new LongField("fileSize",size,Store.YES);
Field field_fileContent = new TextField("fileContent",fileContent,Store.YES);
//创建Document对象 添加field(域)
Document document = new Document();
document.add(field_fileName);
document.add(field_fileContent);
document.add(field_fileSize);
document.add(field_filePath);
//添加到索引库
indexWriter.addDocument(document);
indexWriter.close();
}
}
2. 查询索引
package com.blueSky.lucene;
import java.io.File;
import java.io.IOException;
import javax.management.Query;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
public class MySnippet_index {
@Test
public void indexTest() throws Exception{
FSDirectory directory = FSDirectory.open(new File("F:\\temp\\index"));
IndexReader indexReader = DirectoryReader.open(directory);
//创建indexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//创建TermQuery对象(术语查询)
Term term = new Term("fileName", "全"); //在fileName域中检索
TermQuery query = new TermQuery(term);
//查询(Query为条件)
TopDocs topDocs = indexSearcher.search(query, 10); //最多返回10条
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
// scoreDoc.doc属性就是document对象的id
// 根据document的id找到document对象
Document document = indexSearcher.doc(scoreDoc.doc);
System.out.println(document.get("fileName"));
System.out.println(document.get("fileContent"));
System.out.println(document.get("filePath"));
System.out.println(document.get("fileSize"));
}
indexReader.close();
}
}