前言
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
cp sphinx.conf.dist sphinx.conf
然后边距sphinx.conf
文件:
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
}