# Lucene 基本原理

**URL:** <https://www.isharkfly.com/t/lucene/10239>\
**Category:** 查询检索\
**Created:** [March 2, 2012, 4:51am UTC](https://www.isharkfly.com/t/lucene/10239 "2012-03-02T04:51:11Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [March 2, 2012, 4:51am UTC](https://www.isharkfly.com/t/lucene/10239/1 "2012-03-02T04:51:11Z")

</div>

Lucene是一个高效的，基于Java的全文检索库。

所以在了解Lucene 之前需要了解一下全文检索。那么什么叫做全文检索呢？这要从我们生活中的数据说起。我们生活中的数据总体分为两种：结构化数据和非结构化数据。

```
结构化数据：指具有固定格式或有限长度的数据，如数据库，元数据等。
非结构化数据：指不定长或无固定格式的数据，如邮件，word文档等。然有的地方还会提到第三种，半结构化数据，如XML，HTML 等，当根据需要可按结构化据来处理，也可抽取出纯文本按非结构化数据来处理。非结构化数据又一种叫法叫全文数据。

```

按照数据的分类，搜索也分为两种：

```
对结构化数据的搜索：如对数据库的搜索，用SQL语句。再如对元数据的搜索，如利用windows 搜索对文件名，类型，修改时间进行搜索等。
对非结构化数据的搜索：如利用windows 的搜索也可以搜索文件内容，Linux 下的grep命令，再如用Google和百度可以搜索大量内容数据。

```

对非结构化数据也即对全文数据的搜索也有不同的方法。

一种是顺序扫描法(Serial Scanning)：所谓顺序扫描，比如要找内容包含某一个字符串的文件，就是一个文档一个文档的看，对于每一个文档，从头看到尾，如果此文档包含此字符串，此文档为我们要找的文件，接着看下一个文件，直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容，只是相当的慢。如果你有一个80G 硬盘，如果想在上面找到一个内容包含某字符串的文件，不花他几个小时，怕是做不到。Linux 下的grep 命令也是这一种方式。大家可能觉得这种方法比较原始，但对于小数据量的文件，这种方法还是最直接，最方便的。但是对于大量的文件，这种方法就很慢了。

有人可能会说，对非结构化数据顺序扫描很慢，对结构化数据的搜索却相对较快（由于结构化数据有一定的结构可以采取一定的搜索算法加快速度），那么把我们的非结构化数据想办法弄得有一定结构不就行了吗？

这种想法很天然，却构成了全文检索的基本思路，也即将非结构化数据中的一部分信息提取出来，重新组织，使其变得有一定结构，然后对此有一定结构的数据进行搜索，从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息，我们称之索引。这种说法比较抽象，举几个例子就很容易明白，比如字典，字典的拼音表和部首检字表就相当于字典的索引，对每一个字的解释是非结构化的，如果字典没有音节表和部首检字表，在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理，比如读音，就比较结构化，分声母和韵母，分别只有几种可以一一列举，于是将读音拿出来按一定的顺序排列，每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音，然后按其指向的页数，便可找到我们的非结构化数据——也即对字的解释。这种先建立索引，再对索引进行搜索的过程就叫全文检索(Full-text Search)。

下面这幅图来自《Lucene in action》，但却不仅仅描述了Lucene 的检索过程，而是描述了全文检索的一般过程。

 ![](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/3/3a2a17ee278357d9b480f02534cf8dff7b524e71.png)

[Lucene 原理与代码](http://docs.ossez.com/ossdocs/xhtml/full-text-search/lucene/lucene_theory_and_code/mainp.html)
