实现数据库检索无非就是利用表扫描和索引扫描这两种方式,但是当数据多的时候,这样的查询在效率上特别的不经如人意。
首先从SQL(结构化查询语句)上来实现检索,在思想上是可行的,数据库有两个主要解决方案:走过每一行做比较;这就是所谓的表扫描,它可以是一个相当昂贵的操作,特别是当表是大。另一个是使用索引。第一种方式但是在实际上非常的不合算,首先使用SQL的LIKE运算符来检索,当表特别大的时候LIKE查询开销特别大。在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引结构是用来查找匹配的,使用索引结构是用来查找匹配的信息是很快。但是为表建立索引是要付出代价的,一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫描可以由2步组成:(1) 扫描索引得到对应的rowid值。 (2) 通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的I /O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果表特别大进行的就是索引扫描,取出的数据如果大于总量的5% -- 10%,使用索引扫描会效率下降很多。索引扫描类似于全表扫描,使用这两种方式来讲搜索根本就不是我们想要的结果,我们要想实现搜索结果的更加人性化,来克服SQL查询的弊端。那就是全文检索技术,而java最优秀的全文检索无疑lucene。但是lucene直接对数据库的检索实现比较复杂,而且lucene的底层代码比较烦我现在这个水平根本看不明白。
Hibernate Search技术,作为一个在hibernate orm框架上的一个对lucene的封装拓展,增强了hibernate的全文检索的不足,而且hibernate为 javaee的三剑客之一,是每一个javaee入门程序员的必修课,相对而言hibernate的搜索对于该类程序员就显得比较好入门。
Hibernate Search是在apache Lucene的基础上建立的主要用于Hibernate的持久化模型的全文检索工具。像Lucene这样的检索引擎能够给我们的项目在进行检索的时候带来非常高的效率,但是它们在基本对象的检索时会有一些问题,不能实现检索内容跟实体的转换,Hibernate Search正是在这样的情况下发展起来的,基于对象的检索引擎,能够很方便的将检索出来的内容转换为具体的实体对象。此外Hibernate Search能够根据需要进行同步或异步的索引更新。Hibernate Search是一个用于补充Hibernate核心对于实体模型全文检索的支持不足而产生的项目。Hibernate Search的全文搜索技术完全基于Apache Lucene。而Lucene则是一个建立在Apache软件基金会(http://lucene.apache.org/java)的强大的全文搜索引擎库。它自发布以来迅速成为了Java语言中事实上的全文搜索技术标准。其成功的原因如下: 免费开源,易用且强大的API,它对于数据索引和搜索是不可知论的,其性能和成熟度已经得到充分的证明,和一个充满活力的社区 ,所有这些特质使得Lucene成为全文搜索解决方案中最好的资源库。这也就是为什么HibernateSearch要构建在Lucene之上的原因。Hibernate Search同样是在开源协议下发布的,它是一座连接Lucene的特色功能和Hibernate世界的桥梁。Hibernate Search隐藏了部分低级和复杂的Lucene API,只提供必需的选项,以最少的工作来建立索引和检索Hibernate持久化模型。