- 二话不说,下载http://sphinxsearch.com/downloads。本文选择Sphinx 3.0.3的Windows x64 binaries版本
- 下载后会得到sphinx.对应版本号的文件夹,重命名该文件夹为sphinx(方便后续操作)
- 将上述文件夹放入任意盘符/路径,如:F:\sphinx
ps: 说明:shpinx可抽象理解为是个exe程序,需要一直运行searchd.exe才能做全文索引,相当于服务器要开多一个进程,一直开着 - 将F:\sphinx\etc\sphinx-min.conf.dist复制一份到F:\sphinx\bin\下,并重命名为sphinx.conf
- 导入sql数据F:\sphinx\etc\example.sql,此为官方测试表documents和tags
- 修改F:\sphinx\bin\sphinx.conf文件配置
source src1
{
type = mysql
sql_host = 127.0.0.1 # 服务器主机
sql_user = root # 用户名
sql_pass = root # 密码
sql_db = test # 数据库
sql_port = 3306 # optional, default is 3306
# 该配置设置的东西挺多,也是我自己摸索得知的。(坑)
# 看似很无聊地设置了一条莫名其妙的查询,实则
# 设置了 id 表的主键(必填),shpinx的规定
# 设置了 运用于全文搜索的字段,如下面配置的title, content
# 设置了 索引对应的表,即 documents
sql_query = select id, title, content from documents
# 属性的概念详见官方
sql_attr_uint = group_id # 设置属性
sql_attr_timestamp = date_added # 设置属性
}
index test1
{
source = src1
path = F:\sphinx\data\test1 # 自行新建data文件夹,索引保存的路径
}
indexer
{
mem_limit = 128M
}
searchd
{
listen = 9312
listen = 127.0.0.1:9306:mysql41
log = F:\sphinx\log\searchd.log # 自行新建log文件夹,存放日志文件
query_log = F:\sphinx\log\query.log # 自行新建log文件夹,存放日志文件
read_timeout = 5
max_children = 30
pid_file = F:\sphinx\log\searchd.pid # 自行新建log文件夹,本条保存进程id
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = F:\sphinx\data # data目录
}
- 进入目录F:\sphinx\bin,在此目录打开cmd窗口
- 建立索引,执行start indexer.exe test1,这时就可看到data下面多了好多文件,作索引用的
- 开启守护进程searchd: start searchd.exe
- 将F:\sphinx\api\下的sphinxapi.php复制到自己的测试站点,如:F:\phpstudy\PHPTutorial\WWW\sphinx\
- 在测试站点目录新建index.php
include "./sphinxapi.php";
// sphinx查询
$sc = new SphinxClient();
$sc->SetServer('127.0.0.1', 9312);
$res = $sc->query('test', 'test1');
var_dump($res);
if (!empty($res['matches'])) {
$keys = array_keys($res['matches']);
$keys = join(',', $keys);
$sc->close();
// mysql查询
$link = mysqli_connect('127.0.0.1', 'root', 'root', 'test');
if ($link) {
$query = "select * from documents where id in ({$keys})";
$query_res = mysqli_query($link, $query);
$i = 0;
while($row = mysqli_fetch_assoc($query_res)) {
$final_res[$i] = $row;
$i++;
}
var_dump($final_res);
} else {
echo 'connect error';
}
mysqli_close($link);
}
好了,shpinx初步摸索到这里了,以上即可实现最基本的全文搜索。
下面进入增量索引步骤
增量索引
原理阐述:设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新 增的数据建立增量索引。
- 新建一个计数表
CREATE TABLE sph_counter( counter_id INTEGER PRIMARY KEY NOT NULL, max_doc_id INTEGER NOT NULL);
- 修改sphinx.conf
source src1
{
type = mysql
sql_host = 127.0.0.1
sql_user = root
sql_pass = root
sql_db = test
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type = OFF
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
sql_query = select id, title, content from documents \
WHERE id <= ( SELECT max_doc_id FROM sph_counter WHERE counter_id = 1 )
sql_attr_uint = group_id
sql_attr_timestamp = date_added
}
source moresrc : src1
{
type = mysql
sql_host = 127.0.0.1
sql_user = root
sql_pass = root
sql_db = test
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type = OFF
sql_query = select id, title, content from documents \
WHERE id > ( SELECT max_doc_id FROM sph_counter WHERE counter_id = 1 )
sql_attr_uint = group_id
sql_attr_timestamp = date_added
}
index test1
{
source = src1
path = F:\sphinx\data\test1
}
index moretest : test1
{
source = moresrc
path = F:\sphinx\data\moretest
}
其他保持默认。
- 命令启动,依次执行
start indexer.exe --all --rotate
start searchd.exe
这时,就不需要停searchd,索引后也不再需要重启searchd了。 - 测试阶段,往documents表插入新自定数据,然后单独重建moretest索引
start indexer.exe moretest --rotate - php查询
$res2 = $sc->query('test', 'moretest');
基本上就可以查询出新增的数据了。
接下来就是合并索引的事儿了
合并索引
命令格式很简单:
start indexer.exe --merge main delta --rotate
main就是主索引,delta是增量索引。merge操作可理解为main += delta;
那么,本例中应用以下代码:
start indexer.exe --merge test1 moretest --rotate
这样,就完成了合并操作,接下来php查询下test1索引即可。
补充:php API调用时,query($query,$index)中$index可以设置多个索引名,如query($query,"main;delta"),也就没有必要一定将两个索引合并,或者,合并的次数不用那么多。本例就是:
$res = $sc->query('test', 'test1;moretest');
这样直接简单暴力查询了两个索引,不过还是适当合并下好。
网友评论