白话Lucene原理

前言

在日常开发中,我们经常遇到问题就会找度娘和谷歌,只要输入相关的关键字立马检索出相关的文档,我便可以参见相关的文档学习和了解自己想要的知识,这种强大的搜素功能是屡试不爽啊。这个强大的搜素功能就是靠搜索引擎来支撑的,是通过网络爬虫来访问网页然后抓取过来存取,然后再通过索引来映射对应的网页。具体百度如何实现这强大的检索功能,不是这里的重点,我们这里着重和大家一起学习总结一下Lucene在web开发中的使用,用简单粗暴的方式讲述一下lucene的原理和基础。

既生瑜何生亮

在lucene实现全文检索之前,当人们需要需要检索几篇文章中是否出现有某个关键的字符串。唯一的办法就是把所有的文章一篇一篇的检索一遍。然后才能确定哪几篇文章中包含该关键字,因为要检索所有的文章,所以整个过程的执行需要花费很长的时间,这种吃力不讨好的方式叫做“顺序扫描”,后来人们又发现了一种叫做”全文检索”的技术,这个技术是以Lucene为代表的另一种检索引擎。可能会有一些人会有疑问,既然”顺序扫描”已经可以实现功能,那么为何又要搞个什么”全文检索”。以Lucene为代表的”全文检索”有哪些优势呢?
我们日常生活中遇到的一篇文档,或者说数据库中的记录。他们记录着一些信息,但是需要注意的一点,这里面并不是所有的信息都是很重要的关键字,比如说,在一篇文章中,我们会经常看到“我们”,“你们”,“了”,“的”等其他非关键字,当我们遇到了难题,应该没有人会在百度的检索框输入“我们”然后让百度去检索吧,即使你输入了,百度勉为其难的给你返回了一些页面链接,然后你点进出,发现这些网页中的信息对于自己解决的问题丝毫没有作用,你可能会买骂道:“啥破百度,检索的啥”!开玩笑的,一般我们都知道自己输入哪些关键字。那么我们就可以将一篇文章中的关键字或者说结构化字符串提炼出来,然后建立一个由提炼出来的关键字和对应文档之间的映射,当下次有用户检索该关键字,我们我就将和该关键字相关的文档返回给用户,想必用户肯定能从文档中得到一些想要的信息。这样检索的效率就会有质的提升,而不必傻乎乎的检查一下所有的文章,看看哪几篇文章中有这个关键字。可能有些小伙伴发现了另外一个问题,其实我们在提炼文章的关键字,建立索引的过程中还是要检索所有的文章,这和“顺序扫描”有什么区别。其实肯定是有区别的,全文检索中,我们会在第一次检索数据之前,给所有的文章提炼关键字建立索引,之后就可以查询对应的索引,不需要每次查询的时候都需要建立索引,这样就实现了一次索引多次查询的目的。当我们经常检索大数据量的文档或者数据库的时候,建立索引的优势立马体现出来了。上面就是简单的讲解了什么是“全文检索”,以及他的优势。其实索引建立的过程可不是一句“提炼关键字,建立索引”就能搞定的。这里面涉及的,倒排索引,文档语义分析,分词,停止词,还有检索排序。这些概念我们在后面慢慢讲解。

Lucene的大体结构

说到全文检索,不得不提Lucene,他是实现一个全文检索的工具库,web开发中,我们可能通过这个工具库来为自己的应用添加全文检索功能。Lucene和我们自己的应用之间实现全文检索的原理大致可以参见下图
白话Lucene原理
正如上图所示,我们将应用的数据库数据,文件系统的文档等其他数据,通过Lucene建立索引,应用检索查询的时候先查询索引,然后映射到对应的文档,然后再重新渲染给应用,返回给用户,这就是应用中利用Lucene实现全文检索的大致原理。
那么在Lucene中,索引的建立是怎样建立的,可以参见下图白话Lucene原理
上面通过指定的格式,将Lucene的Document传递给分词器Analyzer来进行分词,经过分词之后,通过索引写入工具将索引写入到指定的目录。
对于索引的索引的查询,可以分为下面的几个步骤
白话Lucene原理
首先建立查询的Query,通过IndexSearcher进行查询,得到命中的TopDocs,然后再通过TopDocs的scoresDocs()方法得到ScoreDoc,通过ScoreDoc得到对应的文档编号,IndexSearcher通过文档编号,使用IndexReader对指定目录的索引进行读取,得到命中后的文档返回。

总结

上面简单介绍了一下Lucene的基本概念,对应Lucene的使用,后面会和大家一起总结使用!