Baidu 和 google 的强大的 web 搜索功能早已深入人心,我们现在已经非常依赖于这两个网站了,在学习和工作中,只要遇到我们自己不了解的东西或遗忘了的东西,我们都会到 baidu 或 google 上去搜一把。 Google 推出的一款桌面搜索工具 GoogleDesktop 主要用来提供对本机文件的搜索,比操作系统自带的搜索功能强大的多。
那我们能在我们自己开发的系统中加上搜索功能吗?我们 java 开发者能用 java 实现类似的搜索功能吗?我们无所不能的 java 当然可以啊。早在 2001 年之前,就有一个绝顶聪明的人用 java 实现了全文检索功能,该工具包现在已经成为 java 社区中最著名的开源软件之一。这个绝顶聪明的人叫 Doug Cutting ,这个工具包就叫 lucene 。
Lucene 是一个开源的全文检索工具包,使用 java 实现。从 2000 年开始, Doug Cutting 把 lucene 放到 SourceForge 上供人随意下载,到了 2001 年, Apache 自由软件联盟将其收入,成为他的一个子项目。从那时起,越来越多的人开始使用和研究他。 Lucene 现在已经成为 java 社区中最著名的开源软件之一,它提供了一组丰富的 API 以供开发者为 java 应用加入全文检索功能。
Lucene 实现全文检索功能主要有三个步骤
<!-- [if !supportLists]-->1、 建立索引 <!-- [endif]-->
建立索引是全文检索的基础, lucene 根据索引检索用户需要查找的目标文档,如果没有索引也就无所谓检索。建立索引时,采用倒排索引的方式进行。什么是倒排呢,就是将一篇文章的文字分成一个个词条,将词条在文章中出现的位置,文章的名称和文章的路径等信息和该词条建立关联。当用户输入关键词检索时, lucene 用词条匹配用户的关键词,匹配成功了,就把此条关联的信息作适当处理输出给用户,这样就用户得到了要查询的结果。
<!-- [if !supportLists]-->2、 查找索引 <!-- [endif]-->
当索引建立好后,就可以对其进行查找了。 Lucene 所建立的索引是存放在文件系统中的,因此查找索引时,需要首先将索引文件打开读入到内存。
<!-- [if !supportLists]-->3、 更新索引 <!-- [endif]-->
由于我们要查找的内容总是不断变化的,所以索引文件也不是一成不变的,而是一个不断更新的过程。 Lucene 也提供了丰富的功能来支持索引的更新功能。
下面的代码演示了 lucene 如何将存储与本地的文件建立索引
// 索引文件存放的路径
File INDEX_DIR = new File("index");
IndexWriter writer = new IndexWriter( INDEX_DIR , new StandardAnalyzer(), true );
// 要建立索引的文件的目录
File file= new File(args[0]);
writer.addDocument(FileDocument.Document (file));
下面的代码演示了 lucene 如何检索索引
IndexReader reader = IndexReader.open ( new File("index"));
Searcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(field, new StandardAnalyzer());
Hits hits = searcher.search(query);//hits 类似于 jdbc 中的 Resultset
本文只是简单的介绍了一下 lucene 是什么以及其基本原理,自行研究。