把文档看了一遍,然后动手测试了搞了两天才绕明白 SphinxSearch 的基本用法 ~
应用场景
之前搜索都是 PHP + MySQL原生态搜索 select like %%
模式,如果遇到数据量较大,就会出现非常慢,甚至每次执行都MySQL等待。如果数据有1000万条,需要全文搜索,效率低下缓慢。一个解决办法Sphinx
踩过的坑
- 总是安装失败
从官网下载Sphinx,安装,启动第一步都错误,不断报错各种。后来捣鼓了很久,才发现版本问题。官网默认下载的Sphinx3.x,但是文档却是2.x,默认配置也是2.x的,完全都没有更新,感觉Sphinx官方的人员都懒得更新这个项目了。改为下载Sphinx2.x,对着文档完全没有错误。
- 如何保证实时同步,包括同步删除
实时是两个,比如MySQL中有记录被删除,那么Sphinx索引中也需要进行删除,MySQL有新增或更高,Sphinx索引中必须进行更新更改。这里我的方案是在MYSQL中新起一个表 sphinx (id int primary,type int default 1 comment '1新增或更新 0表示记录删除 默认1')
,当文档中有记录比如id=1进行了更新或新增,那么写入一条记录id=1,type=1。如果文档中有记录id=xx被删除或不对外索引,写入一条记录id=xxx,type=0。
然后执行创建增量索引 indexer delta --rotate
,创建之后再将增量索引delta
合入到 main
全量索引中,使用的命令 indexer --merge main delta --merge-klists --rotate
,这里要注意的是--merge-klists
这个参数,表示被删除的索引将从全量索引中进行踢出。当然,如果你数据比较少,你可以不创建 delta
增量索引,每次都只是进行 indexer main --rotate
即可。
配置注意
在有增量索引的情况下,有两个注意的地方,就是数据源source main
需要加入一条配置sql_query_post_index = delete from sphinx
表示全量索引每次重建的时候,将Mysql 表sphinx
的记录全部清空。而在增量索引delta
的数据源中需要加入如下配置
source delta : src1 {
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents WHERE id IN ( SELECT id FROM sphinx WHERE type=1 )
sql_query_killlist = SELECT id FROM sphinx where type=0
}
第一个sql_query
表示增量索引中只记录表sphinx
中标记的记录,包括删除的记录。第二段sql_query_killlist
表示需要从索引中删除的记录。
PHP结合注意
网上很多都是使用自带的SphinxApi.php
,但这个是不推荐的方法,PHP链接Sphinx应该使用SphinxQL。SphinxAPI是一种过时将被弃用的方法。PHP 使用 SphinxQL 连接Sphinx的官方例子:
http://sphinxsearch.com/blog/2014/10/20/sphinxql-query-builder-for-php/
composer 库的SphinxQL-Query-Builder
https://github.com/FoolCode/SphinxQL-Query-Builder
测试流程
1.配置sphinx.conf
2.启动searchd,再执行一次 indexer --all
3.增加数据,执行进行索引全量索引 main indexer -c sphinx.conf main --rotate
。或者第二种方案,增加了数据,先执行增量索引indexer -c sphinx.conf delta --rotate
,再执行索引合并,将增量索引合并到全量索引中 indexer -c sphinx.conf --merge main delta --merge-klists --rotate