1 Lucene简介

2016-02-16 21:46:18 1,227

Lucene是一个基于Java的全文搜索引擎(full-text search engine)。Lucene本身不是一个完整的应用,它只是一个类库,提供了一些API让开发者更加简单的在在应用中集成搜索功能。

全文检索与数据库like关键字搜索的区别:

对于初学者而言,通常会疑惑数据库已经提供了基于like关键字的搜索,为什么我们还要学习使用其他的框架来进行检索呢?这个主要是因为数据库提供的like关键字搜索的效率是很低的(需要遍历每一条记录),并且提供的搜索功能很低级。无法满足在实际开发中的需求。

数据库检索的一些限制:

1、表中的记录,必须完全包含某个检索关键字。

例如我们在数据库中,存储的内容是“北京是中国的首都”,那么我们在搜索的时候,如果搜索的是“中国的首都”,那么我们是可以检索出来这条记录的,但是如果我们搜索的是“中国的首都在哪里”,就无法搜索出来这条记录。究其原因,我们使用的是 like "%keyword%"这种方式检索,数据库记录中必须完全包含检索的内容才能搜索到。

2、搜索结果按照相似度排序

所谓相似度,指的是搜索关键字和记录的匹配程度。例如我们在数据库有两条记录,“北京欢迎你”,"中国北京欢迎你"。当我们的检索关键字是"北京欢迎你"的时候,第一条记录时完全匹配上的,而第二条记录时包含搜索关键字。因此第一条记录和搜索关键字的相似度应该高于第二条。但是我们使用like关键字搜索出来的结果,并不会按照相似度进行排序。

3、搜索关键字无法高亮显示

例如我们在百度中搜索“Lucene中文文档",可以看到,显示的结果中,Lucene、中文、文档这三个关键字都会被高亮显示(用红色标记的)部分。

QQ截图20160215224413.png

但是如果我们使用的是like关键字进行搜索的时候,检索的出来的内容是没有这种高亮的效果的。

基于以上数据库检索的一些限制,无法满足我们在实际开发中的需求。因此有了Lucene这样的全文搜索框架。

当我们的应用中整合进Lucene时,在往数据库存储记录时候,我们同时也会这对这条记录建立索引(indexing)文件。目前你只需要知道Lucene的索引文件是一种便于检索的数据结构。索引与数据库记录的区别在于,数据库记录是完整的信息,而索引是我们针对这条记录提取出来的一些可以针对于这条记录进行高效检索的信息,并且索引文件中包含了访问对应的记录的必要信息,例如记录的数据库主键。当我们在模糊搜索某个内容的时候,例如搜索某个产品的名字,我们使用Lucene来完成,检索出来的结果因为包含对应的数据库记录的主键,我们可以再根据这个主键去访问数据库获得记录的完整信息.

在实际开发中,索引库中的每一条记录都对应着数据库中一条记录。每当向数据库中新增、修改或删除一条记录的时候,我们在索引库中也进行同样的操作。即索引库的增删改操作与数据库的增删改是保持同步的

如果用伪代码表示的话,就是这样:

注:DB表示数据库操作,Index表示索引库操作
       public void add(record){
            DB.add(record);
            Index.add(record);
      }
      
       public void update(record){
            DB.update(record);
            Index.update(record);
      }
      
       public void delete(record){
            DB.delete(record);
            Index.delete(record);
      }

我们可以看到,对于一条记录,不论是新增、修改还是删除,我们都要对数据库和索引库同时进行操作。