依赖
<!-- Lucence核心包 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.3.1</version>
</dependency>
<!-- Lucene查询解析包 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 常规的分词(英文) -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>5.3.1</version>
</dependency>
<!--支持分词高亮 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.3.1</version>
</dependency>
<!--支持中文分词 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-smartcn</artifactId>
<version>5.3.1</version>
</dependency>```
建立索引
public class Indexer {
/**
* 写索引实例
*/
private IndexWriter writer;
/**
* 构造方法,实例化IndexWriter
*/
public Indexer(String indexDir) throws Exception {
Directory dir = FSDirectory.open(Paths.get(indexDir));
//标准分词器,会自动去掉空格啊,is a the等单词
Analyzer analyzer = new StandardAnalyzer();
//将标准分词器配到写索引的配置中
IndexWriterConfig config = new IndexWriterConfig(analyzer);
//实例化写索引对象
writer = new IndexWriter(dir, config);
}
}```
/**
* 索引指定目录下的所有文件
*/
public int indexAll(String dataDir) throws Exception {
// 获取该路径下的所有文件
File[] files = new File(dataDir).listFiles();
if (null != files) {
for (File file : files) {
//调用下面的indexFile方法,对每个文件进行索引
indexFile(file);
}
}
//返回索引的文件数
return writer.numDocs();
}
/**
* 索引指定的文件
* @param file
* @throws Exception
*/
private void indexFile(File file) throws Exception {
System.out.println("索引文件的路径:" + file.getCanonicalPath());
//调用下面的getDocument方法,获取该文件的document
Document doc = getDocument(file);
//将doc添加到索引中
writer.addDocument(doc);
}
/**
* 获取文档,文档里再设置每个字段,就类似于数据库中的一行记录
*/
private Document getDocument(File file) throws Exception {
Document doc = new Document();
//开始添加字段
//添加内容
doc.add(new TextField("contents", new FileReader(file)));
//添加文件名,并把这个字段存到索引文件里
doc.add(new TextField("fileName", file.getName(), Field.Store.YES));
//添加文件路径
doc.add(new TextField("fullPath", file.getCanonicalPath(), Field.Store.YES));
return doc;
}
main 方法测试一下
public static void main(String[] args) {
//索引保存到的路径
String indexDir = "D:\\lucene";
//需要索引的文件数据存放的目录
String dataDir = "D:\\lucene\\data";
Indexer indexer = null;
int indexedNum = 0;
//记录索引开始时间
long startTime = System.currentTimeMillis();
try {
// 开始构建索引
indexer = new Indexer(indexDir);
indexedNum = indexer.indexAll(dataDir);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != indexer) {
indexer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//记录索引结束时间
long endTime = System.currentTimeMillis();
System.out.println("索引耗时" + (endTime - startTime) + "毫秒");
System.out.println("共索引了" + indexedNum + "个文件");
}