当前位置:首页 > Safe 2017年04月01日
搭建基于PHP+Mysql+Coreseek的杜工厍

  之前我自己有600多G的,本机Mysql的索引感觉有点慢,然后搜索了一下高效索引的办法查到了SPhinx,然后莫名的把我引向了Coresekk,因为sphinx对中文不太支持,但是随后才发现Coreseek的BUG有点多。

    进入正题吧,Coresekk网上搜索就一堆了


source spdb1

{

    type                    = mysql

    sql_host                = localhost #数据库IP

    sql_user                = root  #数据库用户名

    sql_pass                = root  #数据库密码

    sql_db                  = testst#数据库名称

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    sql_query               = SELECT * FROM a

    sql_attr_uint           = id         #从SQL读取到的值必须为整数

    #sql_attr_timestamp     = date_added  #从SQL读取到的值必须为整数,作为时间属性

    sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集

    sql_query_info          = SELECT * WHERE ID=$id #命令行查询时,从数据库读取原始数据信息

}



source spdb1

{

    type                    = mysql

    sql_host                = localhost #数据库IP

    sql_user                = root  #数据库用户名

    sql_pass                = 161100Me  #数据库密码

    sql_db                  = testst#数据库名称

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    sql_query               = SELECT * FROM a

    sql_attr_uint           = id         #从SQL读取到的值必须为整数

    #sql_attr_timestamp     = date_added  #从SQL读取到的值必须为整数,作为时间属性

    sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集

    sql_query_info          = SELECT * WHERE ID=$id #命令行查询时,从数据库读取原始数据信息

}



#index定义

index spdb1

{

    source            = spdb1    #对应的source名称

    path              = H:/coreseek/var/data/spdb1 #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

    docinfo           = extern

    mlock             = 0

    morphology        = none

    min_word_len      = 1

    ondisk_dict       = 1   #这一项非常重要,意思将索引保存在硬盘而并非内存上,否则会提示内存不足

    html_strip        = 0


    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/

    #charset_dictpath = H:/coreseek/etc/ #BSD、Linux环境下设置,/符号结尾

    charset_dictpath = H:/coreseek/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...

    charset_type        = zh_cn.utf-8

min_infix_len=4#最小的索引长度

#infix_fields=username

#如果你要模糊搜索请设置这个,但是生成的索引文件会比没有模糊搜寻的更大,为了速度我还是取消这个选项吧

}



#全局index定义

indexer

{

    mem_limit            = 200M   #建议128-512M

}

#searchd服务定义

searchd

{

    listen               = 9312   #查询服务监听端口,开启了才会工作

    read_timeout         = 5      #超时

    max_children         = 30     #最大进程


    max_matches          = 1000   #返回1000条

    seamless_rotate      = 0

    preopen_indexes      = 0

    unlink_old           = 1

    pid_file = H:/coreseek/var/log/searchd.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

    log = H:/coreseek/var/log/searchd.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

    query_log = H:/coreseek/var/log/query.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...

    binlog_path =                                #关闭binlog日志

}




    之前我第一次做这个的时候遇到了很多问题,不过后面还是解决了,对于全文索引最大的缺点就是IO操作太大,非常的吃硬盘,需要比数据大5倍以上的空间


    配置完成后接着用 indexer -c ..\etc\sed.conf --all --rotate 建立全文索引。

   

    然后把页面的数据库信息还有返回字段信息改一改


<?php

// 引用sphinxapi类

require "sphinxapi.php";

//关闭错误提示

error_reporting(E_ALL & ~E_NOTICE);

$num = 0;

if (!empty($_GET) && !empty($_GET['q'])) {

    $Keywords = strip_tags(trim($_GET['q']));

    if (!empty($_GET['m']) && 1 == $_GET['m']) {

        $Keywords = substr(md5($Keywords), 8, 16);

    }

    if (!empty($_GET['m']) && 2 == $_GET['m']) {

        $Keywords = md5($Keywords);

    }

    $cl = new SphinxClient();

    // 返回结果设置

    $cl->SetServer('127.0.0.1', 9312);

    $cl->SetConnectTimeout(3);

    $cl->SetArrayResult(true);

    // 设置是否全文匹配

    if (!empty($_GET) && !empty($_GET['f'])) {

        $cl->SetMatchMode(SPH_MATCH_ALL);

    } else {

        $cl->SetMatchMode(SPH_MATCH_ANY);

    }

    if (!empty($_GET) && !empty($_GET['p'])) {

        $p = !intval(trim($_GET['p'])) == 0 ? intval(trim($_GET['p'])) - 1 : 0;

        $p = $p * 20;

        // 我在sed.conf 设置了最大返回结果数1000。但是我在生成页码的时候最多生成20页,我想能满足大部分搜索需求了。

        // 以下语句表示从P参数偏移开始每次返回20条。

        $cl->setLimits($p, 20);

    } else {

        $cl->setLimits(0, 20);

    }

    $res = $cl->Query(".$Keywords.", "*");

    @mysql_connect("localhost", "test", "test"); //数据库账号密码

    mysql_select_db("sed"); //数据库库名名

    if (is_array($res["matches"])) {

        foreach ($res["matches"] as $docinfo) {

            $ids = $ids . $docinfo[id] . ',';

        }

        $ids = rtrim($ids, ',');

        $sql = "select * from md5_sgk where id in($ids)"; //注意修改表名

        mysql_query("set names utf8");

        $ret = mysql_query($sql);

        $num = mysql_num_rows($ret);

    }

}

?>



   The Web of Answers

   

   

   

   


   


   


   




   


       


           

The Web of Answers


       

       


       


           


               

                     完整匹配

               

               

                     

                       MD5匹配(16位)

               

               

                     

                       MD5匹配(32位)

               

           

           


               <input type="text" class="form-control" name="q" placeholder="请输入" value="">

                   


                       

                   

             

       

   

   

<?php

if (0 == !$num) {

    echo "


   


   

    找到与&nbsp{$Keywords}&nbsp相关的结果 {$res[total_found]} 个。用时 {$res[time]} 秒。";

    echo "


       


         


         

Username


         

Email


         

Password


         

Salt


         

From


         ";

    while ($row = mysql_fetch_assoc($ret)) {

        echo "

";

" . $row['username'] . "


        echo "

";

" . $row['email'] . "


        echo "

";

" . $row['password'] . "


        echo "

";

" . $row['salt'] . "


        echo "

";

" . $row['order'] . "


    }

    echo "";

} else {

    if (!empty($_GET) && !empty($_GET['q'])) {

        echo "


       

        找不到与&nbsp{$Keywords}&nbsp相关的结果。请更换其他关键词试试。";

    }

}

?>

   


   


       


           


    <?php

    if (0 == !$num) {

        $pagecount = (int) ($res[total_found] / 20);

        if (!($res[total_found] % 20) == 0) {

            $pagecount = $pagecount + 1;

        }

        if ($pagecount > 20) {

            $pagecount = 20;

        }

        $highlightid = !intval(trim($_GET['p'])) == 0 ? intval(trim($_GET['p'])) : 1;

        for ($i = 1; $i <= $pagecount; $i++) {

            if ($highlightid == $i) {

                echo "


            } else {

                echo "


            }

        }

    }

    ?>

               

           

       

       

       


           


                The Web of Answers &copy;2010-2015 | Powered by b0rg

           

       

       





    还有什么不懂的可以联系QQ 1046774540




    发表评论: