Sphinx是最简单的全文搜索解决方案

    一般的项目因信息量不大(一般不超过10万条)、日均用户几万内,考虑成本等因素,基本是直接用SQL的LIKE就能轻松应用。倘若你的数据量、访问量都比较大,并且需要考虑运营成等,推荐大家试下Sphinx,Sphinx是一款基于SQL的高性能全文检索引擎,我们可以利用Sphinx完成比数据库本身更专业的搜索功能,而且可以有很多针对性的性能优化。

    这里简单说下步骤,有不懂的,可评论中留言。

    1、无论在WINDOWS下测试使用,还是在生产环境的LINUX下安装,都是很简单的。大致步骤为:

    1.1、去官网下载(选择适合自已的操作系统的版本),然后解压到你想要放置的目录中;

    1.2、将目录etc下的sphinx-min.conf.dist(或sphinx.conf.dist,sphinx.conf.dist带有详细说明的配置模板,而sphinx-min.conf.dist没有注解说明,基实是一样的)复制到bin目录下(也可以其它目录,这里建议放在bin目录目的地为了后面不需要指定配置文件的路径),改名为sphinx.conf(其它也可以,你高兴就好);

    1.3、打开sphinx.conf,进行相关的配置(详细的配置,可以看sphinx.conf.dist这个文件的注释说明,或自行网上找下说明),主要是配置MYSQL中的地址、账号、密码、指定数据库,编写想要索引的SQL等。

    1.4、第一次,需运生全局生成索引文件(可以目录下添加DATA和LOG用来记录生成的索引文件和日志);

    1.5、然后启动Sphinx,就可以通用其它客户端(PHP\PYTHON等)来读取了。

    1.6、当然,距离你真正应用还有很多要做的。比如业务系统中添加、修改、删除了信息,都需要去更新Sphinx索引。

    ----------------------------------------

    以下为我收集的文章:

    以下内容来源于:sphinx3.1.1 window php入门实例:https://www.cnblogs.com/phper8/p/10967096.html

    1.下载地址

    http://sphinxsearch.com/downloads/current/

    Sphinx是最简单的全文搜索解决方案

     

    2.解压文件放到盘内

    Sphinx是最简单的全文搜索解决方案

    3.根目录创建 data 和 log 文件夹

    Sphinx是最简单的全文搜索解决方案

    4.复制 etc目录下的 min.conf 到 bin目录 并修改成 后缀.conf 文件

    Sphinx是最简单的全文搜索解决方案

    Sphinx是最简单的全文搜索解决方案

    Sphinx是最简单的全文搜索解决方案

    5.修改.conf内容

    Sphinx是最简单的全文搜索解决方案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #
    # Minimal Sphinx configuration sample (clean, simple, functional)
    #
    source src1
    {
        type            = mysql
        sql_host        = 127.0.0.1
        sql_user        = root
        sql_pass        = root
        sql_db          = test
        sql_port        = 3306  # optional, default is 3306
        sql_query_pre   = SET NAMES utf8
        sql_query       = \
            SELECT id,question \
            FROM questions
        #sql_attr_uint      = group_id
        #sql_attr_timestamp = date_added
    }
    index test1
    {
        source          = src1
        path            = E:/sphinx-3.1.1/data/test1
        ngram_len = 1
        ngram_chars = U+3000..U+2FA1F
    }
    indexer
    {
        mem_limit       = 128M
    }
    searchd
    {
        listen          = 9312
        listen          = 9306:mysql41
        log         = E:/sphinx-3.1.1/log/searchd.log
        query_log       = E:/sphinx-3.1.1/log/query.log
        read_timeout        = 5
        max_children        = 30
        pid_file        = E:/sphinx-3.1.1/log/searchd.pid
        seamless_rotate     = 1
        preopen_indexes     = 1
        unlink_old      = 1
        workers         = threads # for RT to work
        binlog_path     = E:/sphinx-3.1.1/data
    }

    6.生成文件

    indexer --config demo.conf test1

    Sphinx是最简单的全文搜索解决方案

    Sphinx是最简单的全文搜索解决方案

    7.开启sphinx服务

    1
    searchd --config demo.conf

    Sphinx是最简单的全文搜索解决方案

     8.mysql 查询 创建的数据

    1
    mysql -h127.0.0.1 -P9306

    Sphinx是最简单的全文搜索解决方案

    Sphinx是最简单的全文搜索解决方案

    9.PHP查询数据

    Sphinx是最简单的全文搜索解决方案

    Sphinx是最简单的全文搜索解决方案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    $t1 = microtime(true);
    require("sphinxapi.php");
    $sphinx new SphinxClient();
    $sphinx->setServer('127.0.0.1',9312);
    $k '酶'//搜索的关键字
    $sphinx->_limit = 100000;
    $res $sphinx->Query($k,'test1');
    $ids array_keys($res['matches']);
    $ids = implode(','$ids);
    $m = mysqli_connect('127.0.0.1','root','root','test','3306');
    mysqli_query($m,'set names utf8');
    $sql "select * from questions where id in($ids)";
    $res = mysqli_query($m,$sql);
    while ($row=mysqli_fetch_assoc($res)) {
        $data[] = $row;
    }
    $_arr = [];
    foreach ($data as $key => $value) {
        $val str_replace($k"<font color='red'>{$k}</font>"$value['question']);
        $arr['id'] = $value['id'];
        $arr['question'] = $val;
        $_arr[] = $arr;
    }
    $t2 = microtime(true);
    echo '耗时'.round($t2-$t1,3).'秒';
    echo '<pre>';
    var_dump($_arr);

    10.效果

    Sphinx是最简单的全文搜索解决方案

    11.对比mysql查询

    Sphinx是最简单的全文搜索解决方案

     

     

    -----------------------------------------

    以下内容来源于:sphinx的更新与删除:https://my.oschina.net/osmyblog/blog/311556

    索引文件的更新

    思路:如果一条记录修改了,那么就为这条记录重新生成索引。新的记录的索引会覆盖原来旧的的记录的索引

    1.创建一张表:记录所有被修改过的记录的ID

    create table uprecord(

    id  int unsigned not null comment '修改过的记录的ID'

    )

    2.通过PHP程序记录下用户修改一条记录之后,把这条记录的ID插入到uprecord表中

    3.修改sphinx的配置文件(修改增量索引的SQL语句)把修改过的记录也取出来,取出来之后就会把以前的索引给覆盖掉

    Sphinx是最简单的全文搜索解决方案

    4 清空uprecord表
    sql_query_post  =UPDATE a SET max_id=(SELECT max(id) FROM dede_archives);DELETE FROM uprecord;

    索引文件的删除:

    1 修改电影表添加一个字段用来标记是否删除:

    alter table dede_archives add is_deleted unsigned not null default '0';

    2 修改sphinx的配置文件,在电影的数据源上添加一个属性(必须)

    #源定义
    source mymovie
    {
        type           = mysql
        sql_host        = localhost
        sql_user                = root
        sql_pass                = 123456
        sql_db                  = dedecms831
        sql_port                = 3306
        #命令行查询时,设置正确的字符集
        sql_query_pre           = SET NAMES utf8
        sql_query       = SELECT a.id,a.title,b.juqing FROM dede_archives a LEFT JOIN  dede_addon7 b  ON a.id=b.aid 
    
        #在索引创建好之后把最后一条记录的ID存放到A表中
        sql_query_post  =UPDATE a SET max_id=(SELECT max(id) FROM dede_archives)
        sql_attr_bool   =is_deleted    //增加一个属性is_deleted
    }

    3 修改PHP的程序在查询SPHINX时只取出is_deleted属性为0的

    $sp ->SetFilter("is_deleted", array(0))  //查询时,只查询出is_deleted等于0的记录

    4 修改PHP的程序,当删除一条记录时

    a.从数据库更新这条记录的is_deleted=1

    b.更新SPHINX的删除属性为1:需要调用一个方法UpdateAttributes('is_deleted',array(5=>1)) 意思是设置id等于5的这条记录 将其is_deleted字段值设置为1,array()可以有多个

    UpdateAttributes('is_deleted',array(5=>1,6=>1,8=>1))数组的键值代表记录的ID

    5 在生成增量索引之后

    a.可以删除is_deleted=1的从数据库中删除

    sql_query_post = UPDATE a SET max_id=(SELECT max(id) FROM dede_archives);DELETE FROM uprecord;DELETE FROM dede_archives WHERE is_deleted='1';

    b.修改合并的命令在合并时,添加一个参数is_deleted  只取is_deleted为0的记录.

    C:\myenv\coreseek-3.2.14-win32\bin>indexer.exe -c C:\myenv\coreseek-3.2.14-win32\sphinx.conf 
    --merge mymovie mymovie_zl --merge-dst-range is_deleted 0 0  --roate
    标签:Sphinx 发布于:2020-09-17 21:22:40

当前共有0条评论,我也要发表:

    我的名字:

    我的邮箱: