sphinx分词搜索


声明:本文转载自https://my.oschina.net/u/2555277/blog/1649331,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

安装部署


    1.Lamp环境准备
    2.下载支持中文的Sphinx ---> coreseek
    3.安装环境
        m4,gcc,gcc-c++,automake,libtool
    4.安装中文分词组件mmseg
        ##安装mmseg
        $ cd mmseg-3.2.14
        $ ./bootstrap    #输出的warning信息可以忽略,如果出现error则需要解决
        $ ./configure --prefix=/usr/local/mmseg3
        $ make && make install

    5.安装coreseek前准备
        依赖mysql及依赖库
            mysql-server
            mysql-devel

    6.安装coreseek
        $ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1
        $ sh buildconf.sh    #输出的warning信息可以忽略,如果出现error则需要解决
        $ ./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 
        $ make && make ins tall

配置

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source post
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                =
    sql_db                    = test
    sql_port                = 3306    # optional, default is 3306

    #设置字符集
    sql_query_pre = set names utf8
    #设置数据来源
    sql_query= select id,title,content from post

    #sql_attr_uint            = group_id
    #sql_attr_timestamp        = date_added

    #提取具体数据
    sql_query_info_pre = set names utf8
    sql_query_info            = SELECT * FROM post WHERE id=$id
}


#配置索引
index ind_post
{
    source    = post
    path = /usr/local/coreseek/var/data/post
    docinfo        = extern
    
    #去除html标签
    html_strip = 1
    #完整的去除指定标签
    html_remove_elements = style,script
    #去除标签的时候,留下点东西
    html_index_attrs = img=title,alt; a=title,alt
    
    #设置索引字符集
    charset_type    = zh_cn.utf-8
    #设置词典
    charset_dictpath = /usr/local/mmseg3/etc/
}


indexer
{
    mem_limit                = 32M
}


searchd
{
    port                    = 9312
    log                        = /usr/local/coreseek/var/log/searchd.log
    query_log                = /usr/local/coreseek/var/log/query.log
    read_timeout            = 5
    max_children            = 30
    pid_file                = /usr/local/coreseek/var/log/searchd.pid
    max_matches                = 1000
    seamless_rotate            = 1
    preopen_indexes            = 0
    unlink_old                = 1
}

使用

1.基本搜索
    开启服务接口
    /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
2.处理高亮

    $opts = array(
        "before_match" => "<span style="color:red">",
        "after_match" => "</span>"
    );

    foreach($list as $key=>$val){
        $list[$key] = $sp->buildExcerpts($val,"ind_post",$keyword,$opts);
    }

    注意:处理后会变为索引数组

3.设置匹配模式
    $sp->setMatchMode(SPH_MATCH_ANY);

4.设置排序模式
    1.按照默认权重排序
        $sp->setSortMode(SPH_SORT_EXTENDED,"@weight desc");

    2.人工干预排序
        1.配置文件设置属性字段
            sql_attr_uint  = weight 
        2.重建索引
        3.排序
            $sp->setSortMode(SPH_SORT_EXTENDED,"weight desc @weight desc");

====================================
#开启去除标签
    html_strip                              = 1

#去除标签的时候留下的信息
    html_index_attrs                        = img=alt,title; a=title;

#完整去除的标签
    html_remove_elements                    = style, script

====================================
增量索引
    1.给数据库添加一张表,记录完整索引位置
        不管数据是否存在,没有就添加,存在就更新
        replace into sp_count(id,max_id) values(1,8);
        replace into sp_count(id,max_id) values(1,(select max(id) from post));

    2.修改主数据源
        #更新最大id
        sql_query_pre = replace into sp_count(id,max_id) values(1,(select max(id) from post));
        #将当前所有的数据做主索引
        sql_query = select id,title,content,weight from post where id <= (select max_id from sp_count where id = 1);
    3.添加增量数据源
        source postnew : post
        {
            sql_query_pre = set names utf8
            sql_query = select id,title,content,weight from post where id > (select max_id from sp_count where id = 1);
        }
    4.主索引不变,添加增量索引
        index ind_postnew : ind_post
        {
            source = postnew
            path = /usr/local/coreseek/var/data/postnew
        }
    5.结合操作系统的计划任务即可
        每天晚上4:30做主索引,每5分钟做增量索引
        30 4 * * * /usr/local/coreseek/bin/indexer ind_post --rotate
        */5 * * * * /usr/local/coreseek/bin/indexer ind_postnew --rotate
====================================
更新词典词条
    1.编辑/usr/local/mmseg3/etc/unigram.txt   词典模板文件
    2. ../bin/mmseg -u unigram.txt  重新得到词典
    3.替换词典  mv unigram.txt.uni uni.lib
    4.重新创建索引

具体代码

    <?php
    header("content-type:text/html;charset=utf-8");

    //包含类文件
    include "./sphinxapi.php";

    //接收关键字
    $keyword = $_GET["keyword"];

    //实例化sphinx对象
    $sp = new SphinxClient();

    //连接服务器
    $sp->setServer("127.0.0.1","9312");

    //设置匹配模式
    $sp->setMatchMode(SPH_MATCH_ANY);

    //执行搜索
    $result = $sp->query($keyword,"*");

    if($result["total"] == 0) exit("查无数据");

    //整理所有id
    $ids = join(",",array_keys($result["matches"]));

    //连接数据库查数据
    $dsn = "mysql:host=localhost;dbname=test";
    $pdo = new PDO($dsn,"root","");

    $sql = "set names utf8";
    $pdo->query($sql);

    $sql = "select * from post where id in ({$ids})";

    //最终结果
    $data = $pdo->query($sql)->fetchAll(2);

    $opts = array(
        "before_match" => "<span style="color:red">",
        "after_match"=> "</span>"
    );
    //处理结果
    foreach($data as $key=>$val){
       $data[$key] = $sp->buildExcerpts($val,"ind_post",$keyword,$opts);
    }
?>

本文发表于2018年03月22日 22:38
(c)注:本文转载自https://my.oschina.net/u/2555277/blog/1649331,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1684 讨论 0 喜欢 1

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1