简介
为何使用?
在mysql数据库中,对于如下sql语句,select * from xxx where xxx like ‘%xxx’(以%开头的like查询),无法使用到任何索引优化,导致如果数据量非常大,查询速度会非常慢
使用原理
(1)先创建数据源(一张表的select查询结果),
(2)根据数据源创建索引,使用分词技术。
(3)php把查询的关键词给sphinx服务器,sphinx根据关键词查找到关键字在mysql表里面的记录的id.sphinx把id返回给php查询端
(4)php根据返回的id,查询mysql服务器
如何使用?
- 创建数据源与索引位置
复制etc/目录下的 csft_mysql.conf 一份到上一级目录,并改名为:shpinx.conf
配置修改
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
#源定义
source movie
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = sphinx
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT id, title, description FROM movie
}
#index定义
index movie
{
source = movie #对应的source名称
path = E:/tools/sphinx/var/data/movie #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/tools/sphinx/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = E:/tools/sphinx/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = E:/tools/sphinx/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = E:/tools/sphinx/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
}
- 创建索引
indexer.exe –c配置文件 --all | 索引的名字
- 启动sphinx服务器
searchd -c sphinx的配置文件 --install
启动sphinx的服务。【启动端口9312】
net start searchd
- 将api文件复制到项目中
require_once 'sphinxapi.php'; $sc = new SphinxClient(); $sc->setServer('localhost', 9312); $key = "空间"; //索引 $indexName = 'movie'; $sc->setMatchMode(SPH_MATCH_ANY); $res = $sc->query($key, $indexName); echo '<pre>'; print_r($res); echo '</pre>';
结果:
$ids = implode(',', array_keys($res['matches']));
$pdo = new PDO('mysql:host=localhost;dbname=sphinx', 'root', 'root');
$res = $pdo->query("select id,title,description from movie where id in($ids)");
$data = $res->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $v) {
$row = $sc->buildExcerpts($v, $indexName, $key, [
'before_match' => "<font color='red'>",
'after_match' => '</font>'
]);
echo $row[1].'<br/>';
echo $row[2]. '<hr/>';
print_r($row);
}
增量索引
创建一个表用于记录当前查询索引的最大id
create table record(max_id int);
在sphinx.conf中添加
添加增量数据源与索引
#创建增量数据源
source movie_add
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = sphinx
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT id, title, description FROM movie where id > (select max_id from record)
sql_query_post = update record set max_id = (select max(id) from movie);
}
# 创建增量索引
index movie_add
{
source = movie_add #对应的source名称
path = E:/tools/sphinx/var/data/movie_add #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/tools/sphinx/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
生成主索引
.\indexer.exe -c E:\tools\sphinx\sphinx.conf movie --rotate
生成增量索引
.\indexer.exe -c E:\tools\sphinx\sphinx.conf movie_add --rotate
把增量索引合并到主索引里面。
合并的语法:
indexer –c 配置文件 --merge 主索引文件 增量索引文件
indexer.exe –c E:\tools\sphinx\sphinx.conf --merge movie movie_add --rotate