前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CentOS7下安装Sphinx 中文分词【PHP+MySQL】

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

作者头像
无道
发布2019-11-13 16:45:14
1.8K0
发布2019-11-13 16:45:14
举报
文章被收录于专栏:无道编程无道编程

前言

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

截图-1569906767
截图-1569906767

并进入到/usr/lcoal/sphinx

代码语言:javascript
复制
cd /usr/local/sphinx
截图-1569906813
截图-1569906813

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

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

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

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

该目录下有三个文件,

截图-1569907096
截图-1569907096

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

代码语言:javascript
复制
cp sphinx.conf.dist sphinx.conf
截图-1569907175
截图-1569907175

然后边距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
截图-1569908787
截图-1569908787

/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命令

截图-1569912653
截图-1569912653

使用

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

截图-1569912391
截图-1569912391

编写测试代码:

代码语言: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']);
截图-1569912558
截图-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

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

完整配置

代码语言: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
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 下载&&安装
  • 参考文章
  • 完整配置
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档