Lucene以及索引和搜索的流程
Lucene以及索引和搜索的流程
Lucene的普及和成功的背后是因为它的简单。
因此,你不需要深入理解Lucene的信息索引和检索工作方面的知识就可以开始使用。
Lucene提供了简单但是强大的核心API去实现全文索引和检索,你只需要掌握少数的类就能将Lucene整合到应用中。
刚接触Lucene的人可能会误认为Lucene是一个文件搜索工具、网络爬虫、或者网页搜索引擎。实际上Lucene是一个软件库,而不是一个全功能的搜索应用程序。它涉及全文索引和搜索,而且做得非常好。Lucene可以让你的应用程序隐藏起复杂的索引和搜索背后的操作,而使用简单的API处理特定的问题领域和业务规则。你可以想象Lucene就是像一个层,你的应用就在层的上面。
Lucene允许你添加索引和搜索功能到应用程序中。Lucene不关心数据的来源,Lucene可以索引和搜索任何可以转换成文本格式的数据。这意味着你可以用Lucene索引和搜索数据:远程web服务器上的网页、存储在本地文件系统的文档、简单的文本文件、Microsoft Word文档、HTML或PDF文件,或者其他任何可以从中提取文本信息的格式文件。
所有搜索引擎的核心就是索引的概念:把原始数据处理成一个高效的交叉引用查找,以便快速检索。让我们看看快速高效的索引和搜索过程。
1.索引是什么,为什么它这么重要?
假如你需要搜索大量的文件,你希望找到那些包含某个单词或词组的文件。你将如何去写一个程序实现这个功能?一个做法就是按顺序扫描每一个文件,搜索是否包含给定的单词或词组。但是这样的做法有很多缺陷的,其中最明显的就是在大量的文件存在的情况下,速度是令人无法接受的。这种情况下,索引产生了。为了搜索大量的文本,你首先要对这些文本以特定的结构存储,这种存储结构可以让你迅速的搜索,消除慢的顺序扫描的过程。这种存储结构就叫索引,将文本转换成特定结构存储的过程,就叫建立索引。
索引作为一种数据结构,允许你快速随机的访问存储在里面的词。类似于字典的目录,某个词对应到某一页,查找的时候直接定位到那一页,速度就非常快,不用一页一页的翻去查找。Lucene的索引是一种专门设计的数据结构,通常作为一组索引文件存储在文件系统上。
2.什么是搜索?
在索引中搜索关键词,找到包含关键词的文档的过程就是搜索。搜索质量通常使用准确度和召回率来描述。所谓召回率是指一次搜索结果集合中符合用户要求的数目与和用户查询相关的总数之比,而准确率是指一次搜索结果集合中符合用户要求的数目与该次搜索结果总数之比。我们也需要考虑其他有关搜索的因素,比如速度和快速搜索大量文本的能力,单个和多项查询、 短语查询、 通配符、 结果的排名和排序的支持也很重要。
3.Lucene in Action
假如我们需要索引和搜索存储在一个目录下的文件。
在我们使用Lucene进行搜索之前,我们需要先建立索引。使用的Lucene的版本是3.6。
3.1建立索引
1)创建存放索引的目录Directory
2)创建索引器配置管理类IndexWriterConfig
3)使用索引目录和配置管理类创建索引器
4)使用索引器将Document写到索引文件中
索引器类:
public class TestSearcher { /** * 搜索 */ @Test public void testSearch() throws IOException, ParseException{ //搜索关键词 String keyWord = "Java"; //索引目录路径 String indexDirPath = "./indexDir"; //调用搜索器进行搜索 List<Document> docs = Searcher.search(keyWord, indexDirPath); for(Document doc : docs) { System.out.println("文件名 : "+doc.get("name")); System.out.println("路径 : "+doc.get("path")); System.out.println("内容 : "+doc.get("content")); } } }
如果有包含关键词的文件,就会被搜索出来了。