window下使用sphinx

2019-05-26  本文已影响0人  IT小池

sphinx下载与安装

官网下载:http://www.sphinxsearch.com/downloads/
coreseek下载:http://www.coreseek.com/
下载完之后,新建 datalog 目录,用来存放索引文件与一些日志
文件,建立好目录之后,创建一个 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。当数据库中的内容发生改变后,要重新生成索引,或者在数据表中添加一个字段用来标记该条数据是否生成了索引,重建索引时,只生成没有生成索引的记录,然后合并到索引中去即可

上一篇下一篇

猜你喜欢

热点阅读