美文网首页
window下使用sphinx

window下使用sphinx

作者: IT小池 | 来源:发表于2019-05-26 16:32 被阅读0次

    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。当数据库中的内容发生改变后,要重新生成索引,或者在数据表中添加一个字段用来标记该条数据是否生成了索引,重建索引时,只生成没有生成索引的记录,然后合并到索引中去即可

    相关文章

      网友评论

          本文标题:window下使用sphinx

          本文链接:https://www.haomeiwen.com/subject/ztcftctx.html