window下使用sphinx
sphinx下载与安装
官网下载:http://www.sphinxsearch.com/downloads/
coreseek下载:http://www.coreseek.com/
下载完之后,新建 data
和 log
目录,用来存放索引文件与一些日志
文件,建立好目录之后,创建一个 sphinx.conf
配置文件(配置项的信息可以参考etc/sphinx.conf.dist 非常全面)。内容如下:
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
#源定义 ->为那些表建索引,如:我们为php数据库的php_goods表为数据源
source goods
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = php
sql_port = 3306
sql_query_pre = SET NAMES utf8
#主查询:要为那些数据建立索引就使用一条sql语句把这些数据取出来即可
#要求:第一个字段必须是id
#现在给个sql的意思是让sphinx为所有商品的:goods_name,goods_desc,attr_values这三个字段创建全文索引
sql_query = select a.id,a.goods_name,goods_desc,group_concat(b.attr_values) attr_values from php_goods a LEFT JOIN php_goods_attr b ON a.id=b.goods_id group by a.id;
# 实时自动更新: 在创建好索引之后把最后一个商品的id更新到表中【用于sphinx实时更新】
sql_query_post = update php_sphinx_id set id=(select max(id) from php_goods where is_on_sale='是')
}
# 后添加的数据还没有索引的数据的数据源
source goods_new
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = php
sql_port = 3306
sql_query_pre = SET NAMES utf8
# 取出后添加的还没有索引的数据
sql_query = select a.id,a.goods_name,goods_desc,group_concat(b.attr_values) attr_values from php_goods a LEFT JOIN php_goods_attr b ON a.id=b.goods_id AND a.id > (select id from php_sphinx_id) group by a.id;
#在创建好索引之后把最后一个商品的id更新到表中【用于sphinx实时更新】
sql_query_post = update php_sphinx_id set id=(select max(id) from php_goods where is_on_sale='是')
}
#index定义 ->一个数据源对应一个index
#index指的是索引文件存放在哪,数据源建索引的时候对对应生成一个索引文件
index goods
{
source = goods #对应的source名称
#生成的索引文件存放的目录\索引文件的名称[注意:goods是文件名,不是目录]
path = D:\coreseek-3.2.14-win32\var\data\goods
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词词库文件所在目录(就在配置文件目录下,除了配置文件之外的文件)
charset_dictpath = D:\coreseek-3.2.14-win32\etc
charset_type = zh_cn.utf-8
}
index goods_new
{
source = goods_new #对应的source名称
#生成的索引文件存放的目录\索引文件的名称[注意:goods是文件名,不是目录]
path = D:\coreseek-3.2.14-win32\var\data\goods_new
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词词库文件所在目录(就在配置文件目录下,除了配置文件之外的文件)
charset_dictpath = D:\coreseek-3.2.14-win32\etc
charset_type = zh_cn.utf-8
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义 ->sphinx服务器的配置
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
#配置以下三个文件存放的绝对目录(上面新建的 data 与 log目录)
pid_file = D:\coreseek-3.2.14-win32\var/log/searchd_mysql.pid
log = D:\coreseek-3.2.14-win32\var/log/searchd_mysql.log
query_log = D:\coreseek-3.2.14-win32\var/log/query_mysql.log
}
具体配置请看官网文档,配置好配置文件之后,进行创建索引与安装启动服务,使用bin/indexer.exe
创建索引文件的命令:
D:\coreseek-3.2.14-win32\indexer.exe -c 配置文件路径 具体的源
如:
D:\coreseek-3.2.14-win32\bin\indexer.exe -c D:\coreseek-3.2.14-win32\sphinx.conf goods_new
执行完毕后,会在 data
目录下生成索引文件,然后启动服务,找到 bin\searchd.exe
进行启动服务,注意
:这里如果直接执行 searchd.exe
,不是后台服务的形式启动,如果要以后台服务的形式启动,需要安装启动,如:
D:\coreseek-3.2.14-win32\bin\searchd.exe -c D:\coreseek-3.2.14-win32\sphinx.conf --list
然后services.msc
打开服务找到 sphinx服务,然后右键启动,服务器启动ok,然后就可以在项目中直接用它了
sphinx实时自动更新索引
问题:当前我们的数据很多的时候,当我们添加的新的数据时,这时它在 sphinx
中是没用索引的,那么我们如何实现自动更新呢,
1.可以新建一张表,存放每次创建索引后最后一条数据的主键id,注意看上面的 sphinx.conf
文件中的
# 实时自动更新: 在创建好索引之后把最后一个商品的id更新到表中【用于sphinx实时更新】
sql_query_post = update php_sphinx_id set id=(select max(id) from php_goods where is_on_sale='是')
添加上这句之后(每次创建索引之后,会把最后一条数据的 id 添加到php_sphinx_id
表中,如果id 大于这个最后一条数据的 id ,那么就是没用创建索引的文件
),然后进行更新索引文件
D:\coreseek-3.2.14-win32\bin\indexer.exe -c D:\coreseek-3.2.14-win32\sphinx.conf goods_new --rotate
(注意:--rotate
平滑更新索引)更新索引之后,然后为后添加的数据还没有索引的数据的添加一个数据源,注意看上面的 sphinx.conf
文件中的
# 后添加的数据还没有索引的数据的数据源
source goods_new
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = php
sql_port = 3306
sql_query_pre = SET NAMES utf8
# 取出后添加的还没有索引的数据
sql_query = select a.id,a.goods_name,goods_desc,group_concat(b.attr_values) attr_values from php_goods a LEFT JOIN php_goods_attr b ON a.id=b.goods_id AND a.id > (select id from php_sphinx_id) group by a.id;
#在创建好索引之后把最后一个商品的id更新到表中【用于sphinx实时更新】
sql_query_post = update php_sphinx_id set id=(select max(id) from php_goods where is_on_sale='是')
}
index goods_new
{
source = goods_new #对应的source名称
#生成的索引文件存放的目录\索引文件的名称[注意:goods是文件名,不是目录]
path = D:\coreseek-3.2.14-win32\var\data\goods_new
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词词库文件所在目录(就在配置文件目录下,除了配置文件之外的文件)
charset_dictpath = D:\coreseek-3.2.14-win32\etc
charset_type = zh_cn.utf-8
}
然后写一个脚本的执行,window的是 bat 脚本
;linux的是 shell脚本(+x权限就可执行)
,我这里使用的是 windows,所以,新建一个 .bat脚本文件,内容如下:
D:\coreseek-3.2.14-win32\bin\indexer.exe -c D:\coreseek-3.2.14-win32\sphinx.conf goods_new
D:\coreseek-3.2.14-win32\bin\indexer.exe -c D:\coreseek-3.2.14-win32\sphinx.conf goods_new --merge goods goods_new --rotate
2.在数据表中添加一个字段用来标记该条数据是否生成了索引,重建索引时,只生成没有生成索引的记录,然后合并到索引中去即可
2就不演示了
注意:sphinx搜索只是查询sphinx索引,并不查询mysql,从sphinx服务中查询出的id就是mysql 数据库中的主键。根据主键查询mysql。当数据库中的内容发生改变后,要重新生成索引,或者在数据表中添加一个字段用来标记该条数据是否生成了索引,重建索引时,只生成没有生成索引的记录,然后合并到索引中去即可