zoukankan      html  css  js  c++  java
  • sphinx搜索

    2015.8.13

    使用Mysql实现增加索引以实现加快数据搜索
     
    1.增加索引,当你想对某个字段进行like查询或是关联查询时,添加该字段的索引
    或是在phpMyAdmin中进行索引设置
    ALTER TABLE `ecs_goods` ADD INDEX(`goods_sn`);
    2.Sphinx实现索引快速搜索和全文检索
     
    介绍:是一个基于SQL的全文检索引擎,它提供了比数据库更专业的搜索功能,并且sphinx特别为一些脚本语言设置了搜索的API接口,如:php,python等,同时为mysql也设计了一个存储引擎插件
     
    (并在thinkphp中使用)
    yum install expat-devel*  
    cd /mycms/ThinkPHP/Lirary/Vendor/   (thinkphp项目的目录)
    tar xzvf coreseek-3.2.14.tar.gz
    cd coreseek-3.2.14
    cd mmseg-3.2.14
    ./bootstrap
    ./configure --prefix=/usr/local/mmseg3
    make && make install
    cd ..
    cd csft-3.2.14
    wget -O - http://blog.atime.me/static/resource/sphinxexpr-gcc4.7.patch.gz | gzip -d - | patch -p0(防止下面make中出现ExprEval错误
    或者
    直接修改src/sphixexpr.cpp文件的1746, 1777和1823行,将三行中的ExprEval改为this->ExprEval
    参考http://blog.atime.me/note/sphinx-coreseek-summary.html
    sh buildconf.sh 
    ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
    yum install mysql-devel libxml2-devel expat-devel

     make && make install

    cd ..
    cd testpack
    配置csft_mysql.conf文件
    #MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
    #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
     
    #源定义
    source mysql
    {
        type                    = mysql
     
        sql_host                = localhost
        sql_user                = root
        sql_pass                = 123456
        sql_db                    = test
        sql_port                = 3306
        sql_query_pre            = SET NAMES utf8
     
        sql_query                = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
                                                                  #sql_query第一列id需为整数
                                                                  #title、content作为字符串/文本字段,被全文索引
        sql_attr_uint            = group_id           #从SQL读取到的值必须为整数
        sql_attr_timestamp        = date_added #从SQL读取到的值必须为整数,作为时间属性
     
        sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
        sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
    }
     
    #index定义
    index mysql
    {
        source            = mysql             #对应的source名称
        path            = /var/lib/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        docinfo            = extern
        mlock            = 0
        morphology        = none
        min_word_len        = 1
        html_strip                = 0
     
        #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
        charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
        #charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
        charset_type        = zh_cn.utf-8
    }
     
    #全局index定义
    indexer
    {
        mem_limit            = 128M
    }
     
    #searchd服务定义
    searchd
    {
        listen                  =   9312
        read_timeout        = 5
        max_children        = 30
        max_matches            = 1000
        seamless_rotate        = 0
        preopen_indexes        = 0
        unlink_old            = 1
        pid_file = /var/log/searchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        log = /var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        query_log = /var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    }
     
    /usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all(成功后将在var/date目录中生成文件)
    /usr/local/coreseek/bin/search -c etc/csft_mysql.conf 网络搜索(普通搜索测试)
    正常开启搜索服务
    /usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf(将该搜索服务设为进程服务)
    如要停止搜索服务,请使用
    /usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf --stop
    如要已启动服务,要更新索引,请使用
    /usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all --rotate

    mysql数据源的配置可参考testpack/etc/csft_mysql.conf文件

    vi etc/csft_mysql.conf

     

     

    在项目控制器中调用该接口

    1. publicfunction search(){
    2. header("Content-type:text/html;charset=UTF-8");
    3. $keyword = $_GET['kw'];
    4. Vendor('Coreseek.api.sphinxapi');//此处为coreseek中sphinxapi.php文件的目录一般为 coreseek-3.2.14.testpack.api.sphinxapi
    5. //$s = new SphinxClient;
    6. //加载第三方扩展包的文件 文件名不包含class
    7. $db = M();
    8. $spx =new SphinxClient();
    9. //实例化SphinxClient
    10. $spx ->SetServer('127.0.0.1',9312);
    11. //设置ip和端口
    12. $spx->SetConnectTimeout(5);
    13. //设置超时时间
    14. $spx->SetArrayResult(true);
    15. if(strlen($keyword)>=18){
    16. $spx ->SetMatchMode(SPH_MATCH_ALL);//如果用户查询字符大于=18个匹配有查询词
    17. }else{
    18. $spx ->SetMatchMode(SPH_MATCH_ANY);//匹配查询词中的任意一个
    19. }
    20. //------
    21. /*$limit = 12;//每页要显示的数量
    22. $page = $_GET['page']>1 ? $_GET['page'] : 1;
    23. //GET值不为1 则按1算
    24. //$spx->setLimits(0,12);
    25. $off = ($page-1)*$limit;
    26. $spx->SetLimits( $off, $limit);*/
    27. //设置分页
    28. $spx->SetLimits(0,12);//设置查询出多少条数据
    29. $result = $spx -> query("{$keyword}");
    30. //print_r($result);
    31. /*
    32. * 取出matches中的id,组成字符串
    33. */
    34. $str ='';
    35. foreach($result['matches']as $rrs){
    36. $str.=$rrs['id'].',';
    37. }
    38. $ids = rtrim($str,',');
    39. //dump($result['matches']);
    40. //dump($result);
    41. //操作数据库
    42. $sql ="SELECT * FROM cms_post where id in ({$ids})";
    43. $stmt = $db->query($sql);
    44. //循环拼接html并返回
    45. $html="";
    46. $x=1;
    47. foreach($stmt as $u=>$j){
    48. $html.="<tr><td style='text-align: center;'>".$x."</td>";
    49. $html.="<td style='text-align: center;'>". $j['title']."</td>";
    50. $html.="<td style='text-align: center;'>". $j['content']."</td>";
    51. $html .="</tr>";
    52. $x++;
    53. }
    54. $res['html']= $html;
    55. $this->ajaxReturn($res);
    56. }
     



  • 相关阅读:
    4408: [Fjoi 2016]神秘数
    UOJ #35. 后缀排序[后缀数组详细整理]
    POJ 2887 Big String
    搜索过滤grep(win下为findstr)
    解决putty自动断开的问题
    > >> 将错误输出到文件
    环境变量
    端口被占用,查看并杀死占用端口的进程
    查找文件路径find
    【vim使用】
  • 原文地址:https://www.cnblogs.com/kinmos/p/6829820.html
Copyright © 2011-2022 走看看