« 上一篇下一篇 »

利用Search实现高效的全文检索


    不论是使用Memcached还是使用Berkeley DB,大多数时候只能通过特定的方式进行数据检索,满足少部分的检索需求。而大家应该也很清楚,数据库本身对于全模糊LIKE操作的性能是非常低下的,因为这种操作无法利用索引。虽然MySQL的MyISAM存储引擎支持了全文索引,但是官方版本还不支持多字节符集的数据,所以对于需要存放中文或要使用MyISAM之外的存储引擎的用户来说,仍是完全无法使用的。

    对于这种情况,只有一个办法可以解决,那就是通过全文索引软件,即常说的Search(搜索引擎),对数据进行全文索引,才能达到较为高效的数据检索。

    同样,Search软件也有使用较为成熟的第三方解决方案与自行研发两种方式。目前最有名的第三方解决方案主要就是基于Java实现的Lucene,隶属于Apache软件基金Jakarta项目组下面的一个子项目。当然,它并不是一个完整的搜索引擎工具,而是一个全文检索引擎的框架,它同时提供了完整的用语检索的查询引擎和数据索引引擎。

    由于Lucene具有高效的全文索引和分词算法,以及数据检索实现的特性,我们完全可以很好地利用这一优点来解决数据库和传统的cache软件完全无法解决的全文模糊搜索功能。我们的需求和传统的通用全网搜索引擎并不一样,并不需要“Spider”到处去“爬取”互联网上的数据,只要将我们数据库中被持久化下来的数据通过应用程序调用Lucene的相关API写入,并利用Lucene创建好索引,然后就可以通过调用Lucene所提供的数据检索API得到需要访问的数据,而且可以进行全模糊匹配。由于从数据库到Lucene这一过程完全由我们自己来实现,所以非常容易控制数据的实时性。可以做到完全实时,也可以做到固定(或动态)时间段刷新。

    虽然Lucene的数据页是存放在磁盘上面而不是内存中,但是由于高校的分词算法和索引结构,其效率也非常好。看到很多网友在网上讨论,当数据量稍微大一些(如几十个GB)之后Lucene的效率会下降得非常快,其实这是不科学的说法,一个软件性能的好坏,实际上并不只由其本身决定,很多时候一个非常高效的软件不同的人使用会有截然不同的效果。所以,当我们在使用的第三方软件性能出现问题的时候,不要急着下结论认为是这个软件的问题,应该先从自身找找看是否真的正确使用了它。

    除了使用第三方的Search软件如(Lucene)之外,也可以自行研发更适用于自身应用场景的Search软件。

    当然,自行研发Search软件的技术门槛可能也比较高,有此技术实力的开发团队并不是很多,所以在决定自行研发之前,一定要做好各方面的评估。不过如果无法实现一个很通用的Search软件,仅仅针对某些特定功能来说,可能实现也并没有想象的那么复杂,更何况如今的开源世界里各种各样的软件数不胜数,利用现有的攻击,加上自身个性化定制的二次开发,对于有些特定功能的实现可能就会比较轻松了

« 上一篇下一篇 »