CentOS7下安装Sphinx 中文分词【PHP+MySQL】

无道 2019-10-01 0 条评论 教程相关 阅读37 手机阅读

前言

Mysql 的搜索,只能很简单的like '%无道%',那显然是远远不够的。只能找第三方的服务。

国内有 讯搜,国外有 Sphinx

最终选择了Sphinx

Sphinx官网:http://sphinxsearch.com/

阅读本文需要:

1、知道Linux的基本命令

2、知道Linux的基本命令

3、稍微熟悉Linux

因为中间可能有些步骤我写错了,或者就少了那么简单的一步,你就不知道怎么回事了。。

并且,这是需要服务器的,撰写此文是CentOS,虚拟机基本只能用like '%无道%'

下载&&安装

下载

wget http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64.tar.gz

解压

tar -zxvf sphinx-3.1.1-612d99f-linux-amd64.tar.gz

并改名为sphinx,然后移动到/usr/local

截图-1569906767

并进入到/usr/lcoal/sphinx

cd /usr/local/sphinx

截图-1569906813

在此目录下创建data,log文件夹

mkdir data && mkdir log

在/usr/local/sphinx/etc 编写 sphinx.conf 配置文件

vim /usr/local/sphinx/etc/sphinx.conf

该目录下有三个文件,

截图-1569907096

我们需要将sphinx.conf.dist复制并重命名为sphinx.conf

cp sphinx.conf.dist sphinx.conf

截图-1569907175

然后边距sphinx.conf文件:

vim ./sphinx.conf

此文件是需要填写一些配置(包括数据库信息的配置,索引的一些配置)等等。

具体详细信息可以参见:https://www.cnblogs.com/yjf512/p/3598332.html

不过我是看他中文写得我头都大了。

样例让如下(删除注释了):

A.

source src1
{
    type                = mysql
    sql_host            = localhost
    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, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
        FROM documents

    sql_attr_uint        = group_id
    sql_attr_timestamp   = date_added
}

以上就是数据库的配置,包括host,user,pass,db,port。

值得说的是:sql_query 是你要查询的字段,也就是一段select语句,注意着语句要包括主键!

B.

index test1
{
    source                  = src1
    path                    = /usr/local/sphinx/data/test1
    min_word_len            = 1
    ngram_len               = 1
    ngram_chars             = U+3000..U+2FA1F
}

这个是索引,其中source的值和上面A 的命名的src1对应,

path就是存放索引的位置,建议就是我们最之前建立的data文件夹下,

C.

indexer
{
    mem_limit        = 128M
}

这个就是索引器的配置,也即索引时所使用的最大内容

D.

searchd
{
        listen                  = 9312
        listen                  = 9306:mysql41
        log                     = /usr/local/sphinx/log/searchd.log
        query_log               = /usr/local/sphinx/log/query.log
        read_timeout            = 5
        max_children            = 30
        pid_file                = /usr/local/sphinx/log/searchd.pid
        seamless_rotate         = 1
        preopen_indexes         = 1
        unlink_old              = 1
        binlog_path             = /usr/local/sphinx/data/
}

这个可以理解成接口的一些配置信息(这样说不对),

反正就是需要配置好了之后,接口才能使用。

listen:监听端口

然后就是日志存放路径,如果之前建立了data和Log文件夹,那么以上配置基本是现成的,也即log文件夹里面。

注意,以上A.B.C.D虽然我是分开展示出来的,但是他们都是在sphinx.conf文件里面的。

执行生成索引文件的命令:

/usr/local/sphinx/bin/indexer -c  /usr/local/sphinx/etc/sphinx.conf test1

截图-1569908787

/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf test1 --rotate #重新生成索引的命令

运行sphinx

/usr/local/sphinx/bin/searchd -c  /usr/local/sphinx/etc/sphinx.conf

/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf --stop关闭sphinx命令

截图-1569912653

使用

进入api文件夹/usr/local/sphinx/api,将sphinxapi.php复制到你的PHP目录里面。这是相当于sdk的文件,需要引用它。

截图-1569912391

编写测试代码:

<?php

require ( "sphinxapi.php" );
$cl = new SphinxClient ();
$q = "破解版[ARM 64]  MX Player-1.14.5-arm64 Unlocked "; //模拟关键字
$sql = "";
$host = "127.0.0.1";
$port = 9312;
$index = "*";
$cl->SetServer ( $host, $port );
$cl->SetConnectTimeout(10);
$cl->SetArrayResult(true);
$res = $cl->Query ( $q, $index );
var_dump($res['matches']);

截图-1569912558

如图所示,返回的是id,该id是你的表的主键。

每当数据库变动时,需要重新执行索引,不然搜索只会是以前的数据。【重要事情说三遍】

每当数据库变动时,需要重新执行索引,不然搜索只会是以前的数据。【重要事情说三遍】

每当数据库变动时,需要重新执行索引,不然搜索只会是以前的数据。【重要事情说三遍】

参考文章

https://www.cppentry.com/bencandy.php?fid=85&id=251197

https://segmentfault.com/a/1190000008485870

https://www.cnblogs.com/yjf512/p/3598332.html

国内环境就是这样,很多文章都过时、互相抄袭,再加上百度....,要查很多文章才能明白。

你还得带着批判的思想去按照他说的做,不然光按照他说的做,很可能有错误。【当然,不一定是文章的锅,还有可能是软件版本的更新问题。】

完整配置

source src1
{
    type            = mysql
    sql_host        = localhost
    sql_user        = root
    sql_pass        = Mz7passf
    sql_db          = root
    sql_port        = 3306
    sql_query_pre   = SET NAMES utf8 
    sql_query       = SELECT id, from_type,UNIX_TIMESTAMP(created_at) AS date_added FROM lzpan_net_disks
    #sql_attr_uint       = group_id
    sql_attr_timestamp  = date_added
}


index test1
{
    source          = src1
    path            = /usr/local/sphinx/data/test1 
    mlock         = 0 
    min_word_len  = 2
    min_prefix_len = 0
    min_infix_len = 2
    ngram_len     = 1
    ngram_chars = U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, U+3105..U+312C, U+31A0..U+31B7, U+3041, U+3043, U+3045, U+3047, U+3049, U+304B, U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, U+3061, U+3063, U+3066, U+3068, U+306A..U+306F, U+3072, U+3075, U+3078, U+307B, U+307E..U+3083, U+3085, U+3087, U+3089..U+308E, U+3090..U+3093, U+30A1, U+30A3, U+30A5, U+30A7, U+30A9, U+30AD, U+30AF, U+30B3, U+30B5, U+30BB, U+30BD, U+30BF, U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB, U+30CD, U+30CE, U+30DE, U+30DF, U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE, U+30F0..U+30F3, U+30F5, U+30F6, U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, U+31F6, U+31F7, U+31F8, U+31F9, U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, U+A492..U+A4C6  
}

indexer
{
    mem_limit       = 128M
}


searchd
{
    listen          = 9312
    listen          = 9306:mysql41
    log         = /usr/local/sphinx/log/searchd.log
    query_log       = /usr/local/sphinx/log/query.log
    read_timeout        = 5
    max_children        = 30
    pid_file        = /usr/local/sphinx/log/searchd.pid
    seamless_rotate     = 1
    preopen_indexes     = 1
    unlink_old      = 1
    workers         = threads # for RT to work
    binlog_path     = /usr/local/sphinx/data
}
全文完 [
有帮助?打赏
支付宝打赏
微信打赏
]
修改: 10月01日 15:02
这篇文章还没有评论呢~
点击刷新/生成验证码