Sphinx是基于SQL的搜索引擎,可以结合mysql等数据库做全文搜索。它可提供比数据库更专业高效的搜索功能。Sphinx是SQL Phase Index的缩写。Sphinx的设计初衷,就是与SQL数据库可以有效结合。本文将会带你走进sphinx,了解极速搜索的sphinx!

  • 1. 什么是sphinx
  • Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业,更高效的搜索功能。
    简单来说,sphinx相当于在数据库和用户之间加了一层。相比于用户直接从数据库中搜索数据,用户通过sphinx来访问搜索数据库更加高效。sphinx主要通过建立索引的方式,来提高搜索效率。

    在建立索引之前,首先sphinx必须根据数据库生成自己的文档数据(source),每个文档包含文档的ID以及属性(属性用于搜索时删选,排序), 然后sphinx指定source,建立index。

    Sphinx运行时,为了解锁读写操作,Sphinx会在服务器开两个端口,一个用于用户搜索(读操作),另一个用于更新索引(写操作)。
    Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

  • 2. 工作流程
  • Sphinx是建立在SQL之上的,并提供接口给业务调用,具体流程如下:

    首先,我们有个数据库,里面存放着很多数据,这些数据需要支持快速搜索。我们在sphinx配置中指定该数据库,并让sphinx建立索引,运行sphinx,这时候sphinx变存储了我们想要搜索的内容。

    然后,sphinx提供了多种语言的api,我们在业务中封装该api,通过api接口调用和sphinx服务器通讯,传想要搜索的值sphinx会返回唯一标志,和相关信息如数据库中的字段id等。

    由于sphinx往往只存储有用的数据,而不会把所有db数据都存入进来,因此,一般情况下我们会通过数据库查询所有信息。最终,我们得到了想要的信息。

  • 3. Sphinx的特点
  • 说到搜索引擎技术,目前主流的有两个:
    1. lucene (solr, elasticsearch 都是基于它)
    2. sphinx

    Lucene是最为老牌的全文搜索引擎,建索引和搜索的效率也非常之高,创建1000万条数据的索引只需10分钟。Sphinx相较于Lucene,建索引的速度更快,索引1000万条数据仅需2分钟,而且配置比较简单,易于学习。

    Sphinx索引和搜索性能优异。它拥有先进的索引工具,进行文本分析。同时其可以高效处理搜索结果集,通过表示式,WHERE, ORDER BY, GROUP BY对搜索结果排序过滤分组。实践证实可扩展支持数十亿文档记录,TB级别的数据,以及每秒数千次查询。易于集成SQL和XML等数据源,同时支持分布式搜索。

    stackoverflow里面有一篇文章专门介绍了它和Lucene的对比。这里主要阐述下Sphinx的特点:

    1. 结果相关度 是排序的默认条件。你也可以自行指定,也可以配置不同列的权重。
    2. 由于直接跟数据库对话,它建立索引的速度超快,除非你的SQL语句非常复杂,或者某个列没有使用索引。我的项目中没遇到这些问题。
    3. 搜索服务进程占用资源极小,你也可以指定内存大小的分配。
    4. 易扩展,只需把一份索引COPY到多个服务器上,然后再跑多个搜索进程。从其他人那里了解的情况是:在高压高并发下,单极表现就足够好了!所以没必要考虑把它做成分布式。
    5。 它不支持查询纠正(“你是不是想搜索OOXX”?)Sphinx 使用字典进行分词,所以driving 和 drive 返回的搜索结果是一样的。

  • 4. 使用场景
  • 就我个人经验而言,Sphinx的功能还是比较简单的,也正因为简单,安装、学习、线上使用等成本都比较低。

    我推荐的使用场景是:

    ·项目初期,业务需求较为简单。
    ·数据结构简单,简单筛选条件。
    ·数据量很大,但不超过千万。
    ·对于并发、分布式等没有特殊要求。
    ·不需要非常实时的所见即所得。

    总之,Sphinx是用最简单的操作实现了非常用挑战的搜索,欢迎走进Sphinx的世界!