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

2019-11-13 16:45:14 浏览数 (2)

前言

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

国内有 讯搜,国外有 Sphinx

最终选择了Sphinx

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

阅读本文需要: 1、知道Linux的基本命令 2、知道Linux的基本命令 3、稍微熟悉Linux 因为中间可能有些步骤我写错了,或者就少了那么简单的一步,你就不知道怎么回事了。。

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

下载&&安装

下载

代码语言:javascript复制
wget http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64.tar.gz

解压

代码语言:javascript复制
tar -zxvf sphinx-3.1.1-612d99f-linux-amd64.tar.gz

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

并进入到/usr/lcoal/sphinx

代码语言:javascript复制
cd /usr/local/sphinx

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

代码语言:javascript复制
mkdir data && mkdir log

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

代码语言:javascript复制
vim /usr/local/sphinx/etc/sphinx.conf

该目录下有三个文件,

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

代码语言:javascript复制
cp sphinx.conf.dist sphinx.conf

然后边距sphinx.conf文件:

代码语言:javascript复制
vim ./sphinx.conf

此文件是需要填写一些配置(包括数据库信息的配置,索引的一些配置)等等。 具体详细信息可以参见:https://www.cnblogs.com/yjf512/p/3598332.html 不过我是看他中文写得我头都大了。

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

A.

代码语言:javascript复制
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.

代码语言:javascript复制
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.

代码语言:javascript复制
indexer
{
    mem_limit        = 128M
}

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

D.

代码语言:javascript复制
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文件里面的。

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

代码语言:javascript复制
/usr/local/sphinx/bin/indexer -c  /usr/local/sphinx/etc/sphinx.conf test1

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

运行sphinx

代码语言:javascript复制
/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命令

使用

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

编写测试代码:

代码语言:javascript复制
<?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']);

如图所示,返回的是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

国内环境就是这样,很多文章都过时、互相抄袭,再加上百度....,要查很多文章才能明白。 你还得带着批判的思想去按照他说的做,不然光按照他说的做,很可能有错误。【当然,不一定是文章的锅,还有可能是软件版本的更新问题。】

完整配置

代码语言:javascript复制
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
}

0 人点赞