PHP高级工程师|全栈工程师|WX: Aben_Ring

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: 
cd\sphinx/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

posted @ 2018-04-23 17:23  懒牛拉车  阅读(644)  评论(0编辑  收藏  举报