Lucene 入门之创建索引和搜索
2014-04-08 14:44
453 查看
本例使用Lucene3.5.0版本
Lucene由3部分组成,索引部分,分词部分,搜索部分,本文简单介绍索引部分和搜索部分。
创建索引可分为5步:
1、创建Directory来存储索引
2、创建Indexwriter来写索引
3、创建Document来存储信息
4、为Document创建Field
5、通过IndexWriter添加文档
创建搜索可分为8部分:
1、创建Directory来获取索引
2、创建IndexReader来读取索引
3、根据IndexReader来创建IndexSearcher
4、创建搜索的Query
5、根据Searcher搜索并返回TopDocs
6、根据topDocs返回scoreDocs
7、根据Searcher和scoreDocs获取Document
8、根据Document获取文档信息
代码如下:
package com.lkt.lucene;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class HelloLucene2 {
/**
* 建立索引
*/
public void index(){
IndexWriter writer=null;
try {
//1.创建Directory,用来存储索引(FSDirectory,存储在硬盘中)
Directory dir = FSDirectory.open(new File("F:"+File.separator+"workspace"+File.separator+"lucene"));
//2.创建IndexWriter,用来写索引
//版本和分词器,此例用标准分词器
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
writer = new IndexWriter(dir, iwc);
//3.创建Document对象
Document doc =null;
//4.为Document添加Field
File file =new File("F:\\学习资料\\javascript\\workspace");
for (File f : file.listFiles()) {
doc = new Document();
doc.add(new Field("content", new FileReader(f)));
//存储文件名,是否将文件名存储到硬盘,是否分词
doc.add(new Field("filename", f.getName(),Field.Store.YES ,Field.Index.NOT_ANALYZED));
doc.add(new Field("filepath", f.getAbsolutePath(),Field.Store.YES ,Field.Index.NOT_ANALYZED));
//5.将文档添加到索引中
writer.addDocument(doc);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(writer!=null){
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 搜索
*/
public void searcher(){
IndexReader reader=null;
try {
//1.创建Directory
Directory dir = FSDirectory.open(new File("F:"+File.separator+"workspace"+File.separator+"lucene"));
//2.创建IndexReader,读取索引
reader = IndexReader.open(dir);
//3.根据IndexReader创建Indexsearcher
IndexSearcher searcher = new IndexSearcher(reader);
//4.创建搜索的Query
//创建QueryParser 来确认要搜索的内容,第二个参数要搜索的域
QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content",new StandardAnalyzer(Version.LUCENE_35));
//创建Query,表示搜索域中包含Java的文件
Query query = queryParser.parse("javascript");
//5.根据Searcher搜索并且返回TopDocs
//搜索10条
TopDocs topDocs = searcher.search(query, 10);
//6.根据TopDocs获取ScoreDoc对象
ScoreDoc[] scoreDocs= topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
//7.根据searcher和ScoreDoc得到Document对象
Document d = searcher.doc(scoreDocs[i].doc);
//8.根据Document得到需要的值
System.out.println(d.get("filename")+"["+d.get("filepath")+"]");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader!=null){
reader.clone();
}
}
}
}
Lucene由3部分组成,索引部分,分词部分,搜索部分,本文简单介绍索引部分和搜索部分。
创建索引可分为5步:
1、创建Directory来存储索引
2、创建Indexwriter来写索引
3、创建Document来存储信息
4、为Document创建Field
5、通过IndexWriter添加文档
创建搜索可分为8部分:
1、创建Directory来获取索引
2、创建IndexReader来读取索引
3、根据IndexReader来创建IndexSearcher
4、创建搜索的Query
5、根据Searcher搜索并返回TopDocs
6、根据topDocs返回scoreDocs
7、根据Searcher和scoreDocs获取Document
8、根据Document获取文档信息
代码如下:
package com.lkt.lucene;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class HelloLucene2 {
/**
* 建立索引
*/
public void index(){
IndexWriter writer=null;
try {
//1.创建Directory,用来存储索引(FSDirectory,存储在硬盘中)
Directory dir = FSDirectory.open(new File("F:"+File.separator+"workspace"+File.separator+"lucene"));
//2.创建IndexWriter,用来写索引
//版本和分词器,此例用标准分词器
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
writer = new IndexWriter(dir, iwc);
//3.创建Document对象
Document doc =null;
//4.为Document添加Field
File file =new File("F:\\学习资料\\javascript\\workspace");
for (File f : file.listFiles()) {
doc = new Document();
doc.add(new Field("content", new FileReader(f)));
//存储文件名,是否将文件名存储到硬盘,是否分词
doc.add(new Field("filename", f.getName(),Field.Store.YES ,Field.Index.NOT_ANALYZED));
doc.add(new Field("filepath", f.getAbsolutePath(),Field.Store.YES ,Field.Index.NOT_ANALYZED));
//5.将文档添加到索引中
writer.addDocument(doc);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(writer!=null){
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 搜索
*/
public void searcher(){
IndexReader reader=null;
try {
//1.创建Directory
Directory dir = FSDirectory.open(new File("F:"+File.separator+"workspace"+File.separator+"lucene"));
//2.创建IndexReader,读取索引
reader = IndexReader.open(dir);
//3.根据IndexReader创建Indexsearcher
IndexSearcher searcher = new IndexSearcher(reader);
//4.创建搜索的Query
//创建QueryParser 来确认要搜索的内容,第二个参数要搜索的域
QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content",new StandardAnalyzer(Version.LUCENE_35));
//创建Query,表示搜索域中包含Java的文件
Query query = queryParser.parse("javascript");
//5.根据Searcher搜索并且返回TopDocs
//搜索10条
TopDocs topDocs = searcher.search(query, 10);
//6.根据TopDocs获取ScoreDoc对象
ScoreDoc[] scoreDocs= topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
//7.根据searcher和ScoreDoc得到Document对象
Document d = searcher.doc(scoreDocs[i].doc);
//8.根据Document得到需要的值
System.out.println(d.get("filename")+"["+d.get("filepath")+"]");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader!=null){
reader.clone();
}
}
}
}
相关文章推荐
- 全文检索Lucene入门之创建索引及简单搜索
- Lucene 6.2.1入门教程(一) 创建索引和基本搜索索引
- Lucene.net 从创建索引到搜索的代码范例
- lucene索引创建与查询入门例子
- lucene--创建索引,搜索
- 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
- Lucene创建索引及搜索
- 利用Lucene.net搭建站内搜索(3)---创建索引
- Lucene系列 - 索引(六) - 创建本地搜索的索引
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- Lucene创建索引与搜索索引试手
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- Lucene创建索引和搜索索引
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
- Lucene2.9.2 + 盘古分词2.3.1(一) 入门: 建立简单索引,搜索(原创)
- 搜索引擎系列 -lucene简介 创建索引和搜索初步步骤
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
- Lucene创建索引入门案例
- 利用Lucene.net搭建站内搜索(3)---创建索引
- Lucene.Net核心类简介,创建索引,搜索,Lucene高亮组建演示,Rss获得最新帖子,只索引帖子的有意义部分,在AddDocument之前先移除旧有文档.