Mysql 的搜索,只能很简单的like '%无道%'
,那显然是远远不够的。只能找第三方的服务。
最终选择了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
并进入到/usr/lcoal/sphinx
cd /usr/local/sphinx
在此目录下创建data,log文件夹
mkdir data && mkdir log
在/usr/local/sphinx/etc 编写 sphinx.conf 配置文件
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.
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
/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命令
使用
进入api文件夹/usr/local/sphinx/api
,将sphinxapi.php
复制到你的PHP目录里面。这是相当于sdk的文件,需要引用它。
编写测试代码:
<?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
国内环境就是这样,很多文章都过时、互相抄袭,再加上百度....,要查很多文章才能明白。 你还得带着批判的思想去按照他说的做,不然光按照他说的做,很可能有错误。【当然,不一定是文章的锅,还有可能是软件版本的更新问题。】
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
}