前几天看到mysql的全文搜索,现在的mysql虽然支持全文搜索,却不支持中文的搜索。看到sphinx可以作为一个搜索引擎实现中文搜索,于是这几天进行研究。
首先介绍下sphinx(斯芬克斯)的实现原理:
mysql其实也可以实现中文搜索,像sql:select * from articles where title like "%标题%"但我们知道,like的搜索只有左边没有%时才会用到索引,两边都有%的是用不到索引的。如果网站的访问量很大,使用like实现模糊查询实在是太慢了。这时候要想使搜索速度变快,我们就用到了sphinx。
Sphinx的整个工作流程就是Indexer程序到数据库里面提取数据,对数据进行分词,然后根据生成的分词生成单个或多个索引,并将它们传递给searchd程序。然后客户端可以通过API调用进行搜索。
例如:我们有一张表如下图
sphinx的配置项中有个source(数据源),从里面可以配置数据的来源就是上面这张表。然后sphinx中的indexer程序根据这张表进行分词。比如查找test,sphinx就会找到id为1,2,4的三条记录。我们可以根据sphinx返回的到数据表中查找记录详细信息。
原理介绍完了,接下来我们说一下sphinx的安装。
刚开始安装时我是在http://sphinxsearch.com/downloads/current/下载的最新版3.1.1,可是当我按照网上的步骤操作时,却出现了问题。
当在bin目录下执行indexer testindex和searchd时,都出现了indexer或searchd不是内部或外部命令。大家可以看一下,下图是3.1.1的解压包,它的indexer后面是没有.exe
然后我又下载了3.0.3,解压后如图。可以看到,后面是有.exe的
然后我就用3.0.3的建立索引。indexer testindex.接着启动searchd却报错了。按着网上的步骤搜索测试search test.也是提示search不是内部或外部命令(刚开始用的searchd test进行搜索报错,看了网上的是search test,可是bin目录下却没有search.exe这是程序,纳闷了好久)
后来又找相关视频,视频中是下载的2.1.1版本,2.1.1版本是有search.exe这个程序的
接下来正式安装sphinx(注意:使用的是2.1.1版本)
新建data和log目录
配置sphinx.conf文件,我们可以用sphinx-min.conf.in进行修改
如果搜索中文是一定要设置字符集
接下来建立索引,在bin目录下执行,testindex是配置文件中index后面的名称
执行搜索,搜索test
如果想重新建立索引可以这样
在命令行下搜索中文会搜索不到,我们可以在程序中搜索中文
PHP中调用Sphinx有两种方式
方式一:使用Sphinx官方提供的api文档,引入include 'sphinxapi.php';
方式二:
(1)在这里 https://pecl.php.net/package/sphinx/1.3.2/windows 下载Sphinx模块(根据自身环境选择相应版本,可以通过phpinfo进行查看)
(2)下载后解压,并将解压得到的php_sphinx.dll文件放到php的ext目录下
使用
3.1.1和3.0.3的版本没研究好,有研究好的大神请告知