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

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

7、php安装sphinx拓展就不说了。ext下加入dll文件

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

php.ini下配置。重启apache

extension=php_sphinx.dll

到此配置结束。

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

<?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


$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);
}

 结果展示

猜你喜欢

转载自www.cnblogs.com/qq917937712/p/8920506.html