美文网首页
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