美文网首页
shpinx摸索历程(windows环境)

shpinx摸索历程(windows环境)

作者: kofzx | 来源:发表于2018-12-18 17:16 被阅读0次
    1. 二话不说,下载http://sphinxsearch.com/downloads。本文选择Sphinx 3.0.3的Windows x64 binaries版本
    2. 下载后会得到sphinx.对应版本号的文件夹,重命名该文件夹为sphinx(方便后续操作)
    3. 将上述文件夹放入任意盘符/路径,如:F:\sphinx
      ps: 说明:shpinx可抽象理解为是个exe程序,需要一直运行searchd.exe才能做全文索引,相当于服务器要开多一个进程,一直开着
    4. 将F:\sphinx\etc\sphinx-min.conf.dist复制一份到F:\sphinx\bin\下,并重命名为sphinx.conf
    5. 导入sql数据F:\sphinx\etc\example.sql,此为官方测试表documents和tags
    6. 修改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目录
    }
    
    
    1. 进入目录F:\sphinx\bin,在此目录打开cmd窗口
    2. 建立索引,执行start indexer.exe test1,这时就可看到data下面多了好多文件,作索引用的
    3. 开启守护进程searchd: start searchd.exe
    4. 将F:\sphinx\api\下的sphinxapi.php复制到自己的测试站点,如:F:\phpstudy\PHPTutorial\WWW\sphinx\
    5. 在测试站点目录新建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初步摸索到这里了,以上即可实现最基本的全文搜索。

    下面进入增量索引步骤

    增量索引

    原理阐述:设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新 增的数据建立增量索引。

    1. 新建一个计数表
    CREATE TABLE sph_counter(    counter_id INTEGER PRIMARY KEY NOT NULL,    max_doc_id INTEGER NOT NULL);
    
    1. 修改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 
    }
    

    其他保持默认。

    1. 命令启动,依次执行
      start indexer.exe --all --rotate
      start searchd.exe
      这时,就不需要停searchd,索引后也不再需要重启searchd了。
    2. 测试阶段,往documents表插入新自定数据,然后单独重建moretest索引
      start indexer.exe moretest --rotate
    3. 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');
    

    这样直接简单暴力查询了两个索引,不过还是适当合并下好。

    相关文章

      网友评论

          本文标题:shpinx摸索历程(windows环境)

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