论文部分内容阅读
【摘 要】Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
【关键词】搜索引擎;Lucene;全文搜索
中图分类号:TP18 文献标识码:A 文章编号:1009-8283(2009)03-0107-01
这是一个建立文件索引的例子
public void doIndex () throws IOException
{
Date date1 = new Date();?
IndexWriter writer = new IndexWriter("c:\\\\index",new StandardAnalyzer(),true);
File file = new File("c:\\\\file");
/**
* 例子主要是将C:\\\\file目录下的文件的内容进行建立索引,将文件路径作为搜索内容的附属.
*/
if(file.isDirectory())
{
String[]fileList = file.list();
for (int i = 0;i < fileList.length;i++)
{
Document doc = new Document();
File f = new File(file,
fileList[i]);
Reader reader = new BufferedReader(new FileReader(f));
doc.add(new Field("file",reader));//为doument添加field
doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NO));
writer.addDocument(doc);
}
}
writer.close();//这一步是必须的,只有这样数据才会被写入索引的目录里
Date date2 = new Date();
System.out.println("用时"+(date2.getTime()-date1.getTime())+"毫秒");
}
分析
为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document,Field,IndexWriter,Analyzer,Directory。下面我们分别介绍一下这五个类的用途:
Document
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
其实从上面的例子就可以看出建立索引就用到Document,IndexWriter,Field。
最简单的步骤就是:
首先分别new 一个Document,IndexWriter,Field
然后用Doument.add()方法加入Field,
其次用IndexWrtier.addDocument()方法加入Document。
最后调用一下IndexWriter.close()方法关闭输入索引,这一步非常的重要只有调用这个方法索引才会被写入索引的目录里,而这是被很多初学的人所忽略的。
一个通过索引来全文检索的例子
public void doSearch() throws IOException,ParseException
{
IndexSearcher indexSearcher = new IndexSearcher("c:\\\\index");
QueryParser queryParser = new QueryParser("file",//这是一个分词器
new StandardAnalyzer());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Query query = queryParser.parse(br.readLine());
Hits hits = indexSearcher.search(query);
Document doc = null;
System.out.print("正搜索................");
for (int i = 0;i < hits.length();i++)
{
doc = hits.doc(i);
System.out.println("内容是:"+doc.get("file"));
System.out.println("文件的路径是:" + doc.get("path"));
}
}
利用Lucene进行搜索就像建立索引一样也是非常方便的。在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。
【关键词】搜索引擎;Lucene;全文搜索
中图分类号:TP18 文献标识码:A 文章编号:1009-8283(2009)03-0107-01
这是一个建立文件索引的例子
public void doIndex () throws IOException
{
Date date1 = new Date();?
IndexWriter writer = new IndexWriter("c:\\\\index",new StandardAnalyzer(),true);
File file = new File("c:\\\\file");
/**
* 例子主要是将C:\\\\file目录下的文件的内容进行建立索引,将文件路径作为搜索内容的附属.
*/
if(file.isDirectory())
{
String[]fileList = file.list();
for (int i = 0;i < fileList.length;i++)
{
Document doc = new Document();
File f = new File(file,
fileList[i]);
Reader reader = new BufferedReader(new FileReader(f));
doc.add(new Field("file",reader));//为doument添加field
doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NO));
writer.addDocument(doc);
}
}
writer.close();//这一步是必须的,只有这样数据才会被写入索引的目录里
Date date2 = new Date();
System.out.println("用时"+(date2.getTime()-date1.getTime())+"毫秒");
}
分析
为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document,Field,IndexWriter,Analyzer,Directory。下面我们分别介绍一下这五个类的用途:
Document
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
其实从上面的例子就可以看出建立索引就用到Document,IndexWriter,Field。
最简单的步骤就是:
首先分别new 一个Document,IndexWriter,Field
然后用Doument.add()方法加入Field,
其次用IndexWrtier.addDocument()方法加入Document。
最后调用一下IndexWriter.close()方法关闭输入索引,这一步非常的重要只有调用这个方法索引才会被写入索引的目录里,而这是被很多初学的人所忽略的。
一个通过索引来全文检索的例子
public void doSearch() throws IOException,ParseException
{
IndexSearcher indexSearcher = new IndexSearcher("c:\\\\index");
QueryParser queryParser = new QueryParser("file",//这是一个分词器
new StandardAnalyzer());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Query query = queryParser.parse(br.readLine());
Hits hits = indexSearcher.search(query);
Document doc = null;
System.out.print("正搜索................");
for (int i = 0;i < hits.length();i++)
{
doc = hits.doc(i);
System.out.println("内容是:"+doc.get("file"));
System.out.println("文件的路径是:" + doc.get("path"));
}
}
利用Lucene进行搜索就像建立索引一样也是非常方便的。在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。