zoukankan      html  css  js  c++  java
  • PHP搜索优化 sphinx 搭建测试

    安装。环境:win7 64位

    1、下载sphinx文件包

    下载地址:http://sphinxsearch.com/downloads/archive/

    2、解压到D:/sphinx。新建文件夹data 和 log,在本地test库中,导入example.sql文件。结构如下

    3、配置 复制sphinx.conf.in文件到bin目录下。重命名为sphinx.conf。配置内容如下。每一行代表什么意思,目前我也说不清楚,后续吧...

    注意两点:红色为我修改过的内容,黄底的地方,命名需要一致。

    # 配置数据源
    source src1
    {
        type            = mysql
        sql_host        = localhsot
        sql_user        = root
        sql_pass        = 
        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_attr_uint        = group_id
        sql_attr_timestamp    = date_added
        sql_ranged_throttle    = 0
    }
    
    source src1throttled : src1
    {
        sql_ranged_throttle    = 100
    }
    
    # 配置数据源生成的索引文件存放的位置
    index test1
    {
        source            = src1
        path            = D:/sphinx/data/test1  # 注意此处包含生成的文件路径和名称。会在data目录下生成test1.***格式的文件
        charset_table     = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
        docinfo            = extern
        dict            = keywords
        mlock            = 0
        morphology        = none
        min_word_len    = 1
        ngram_len        = 1
        ngram_chars        = U+3000..U+2FA1F
        html_strip        = 0
    }
     
    indexer
    {
        mem_limit        = 128M
    }
    
    # 配置Sphinx服务器的信息
    searchd
    {
        listen            = 9312
        listen            = 9306:mysql41
        log                = D:/sphinx/log/searchd.log
        query_log        = D:/sphinx/log/query.log
        read_timeout        = 5
        client_timeout        = 300
        max_children        = 30
        persistent_connections_limit    = 30
        pid_file            = D:/sphinx/log/searchd.pid
        preopen_indexes        = 1
        unlink_old            = 1
        mva_updates_pool    = 1M
        max_packet_size        = 8M
        max_filters            = 256
        max_filter_values    = 4096
        max_batch_queries    = 32
        workers                = threads 
      # windows下启动searchd服务一定要注释掉这个
      # seamless_rotate  = 1
    }

    4、建立索引

    indexer.exe test1

    5、启动服务

    searchd.exe --pidfile

    或者

    searchd

    也可以制作成.bat文件,方便快速启动。新建文件“测试.bat”,用文本编辑器打开,写入如下内容。可以根据自己环境,自行修改。双击即可启动sphinx

    @echo off 
    d: 
    cdsphinx/bin
    searchd

    6、如果需要关闭服务,直接关闭DOC窗口

    7、(拓展)php安装sphinx拓展就大概说一下。也可以不安装拓展,代码中引入文件即可

    require('sphinxapi.php');

    ext下加入dll文件

    下载地址:http://pecl.php.net/package/sphinx

    php.ini下配置。重启apache

    extension=php_sphinx.dll

    到此配置结束。

    测试用例1。输出符合搜索关键词的ID

    <?php

     # 如果php中安装了sphinx.dll拓展,则不需要这一行代码
     require('sphinxapi.php');

    $keyword = 'test';
    $sphinx = new SphinxClient;
    $sphinx->setServer("localhost", 9312);
    $sphinx->setMatchMode(SPH_MATCH_ANY);   //匹配模式 ANY为关键词自动拆词,ALL为不拆词匹配(完全匹配)
    $sphinx->SetArrayResult ( true );    //返回的结果集为数组
    $result = $sphinx->query($keyword,"test1");    //星号为所有索引源
    $count=$result['total'];        //查到的结果条数
    $time=$result['time'];            //耗时
    $arr=$result['matches'];        //结果集
    $id='';
    for($i=0;$i<$count;$i++){
        $id.=$arr[$i]['id'].',';
    }
    $id=substr($id,0,-1);            //结果集的id字符串
    
    echo $id;

    结果展示:

    测试用例2。符合搜索关键词高亮

    <?php
    # 如果php中安装了sphinx.dll拓展,则不需要这一行代码
     require('sphinxapi.php'); $keyword
    = 'test'; $sphinx = new SphinxClient(); $sphinx->SetServer('localhost',9312); $sphinx->setMatchMode(SPH_MATCH_ANY);//匹配模式 SPH_MATCH_ALL:完全匹配 $result = $sphinx->query($keyword,'*');//*表示在所有索引里面进行搜索 $ids = implode(',',array_keys($result['matches'])); $conn = mysqli_connect('localhost','root',''); mysqli_query($conn,'set names utf8'); mysqli_select_db($conn,'test'); $sql = "select * from documents where id in (".$ids.")"; $rst = mysqli_query($conn,$sql); //给匹配关键字添加样式 $opts = array( 'before_match'=>'<font style="font-weight:bold;color:#f00;">', 'after_match'=>'</font>' ); echo '<pre>'; while($row = mysqli_fetch_assoc($rst)){ $row2 = $sphinx->buildExcerpts($row,'test1',$keyword,$opts);//test1 配置文件中的主数据源索引 print_r($row2); }

     结果展示

     用定时任务,自动更新索引,可以参考网址:http://v9.help.phpcms.cn/html/2010/search_0919/35.html

  • 相关阅读:
    Mac开发——设置关闭窗口之后点击Dock中的图标可以再次打开窗口
    添加学院的 Exchange邮箱到手持设备中
    黑苹果 装SVN工具 cornerstone无法打开解决办法——网卡内建
    解决cocos2dx在Xcode中运行时报:convert: iCCP: known incorrect sRGB profile 的问题
    Lua中的正则表达式的使用
    C++11 标准新特性:Defaulted 和 Deleted 函数
    HTML5基础
    第一本书考试错题
    字符串
    带参数的方法
  • 原文地址:https://www.cnblogs.com/qq917937712/p/8920506.html
Copyright © 2011-2022 走看看