Sphinx是最简单的全文搜索解决方案
一般的项目因信息量不大(一般不超过10万条)、日均用户几万内,考虑成本等因素,基本是直接用SQL的LIKE就能轻松应用。倘若你的数据量、访问量都比较大,并且需要考虑运营成等,推荐大家试下Sphinx,Sphinx是一款基于SQL的高性能全文检索引擎,我们可以利用Sphinx完成比数据库本身更专业的搜索功能,而且可以有很多针对性的性能优化。
这里简单说下步骤,有不懂的,可评论中留言。
1、无论在WINDOWS下测试使用,还是在生产环境的LINUX下安装,都是很简单的。大致步骤为:
1.1、去官网下载(选择适合自已的操作系统的版本),然后解压到你想要放置的目录中;
1.2、将目录etc下的sphinx-min.conf.dist(或sphinx.conf.dist,sphinx.conf.dist带有详细说明的配置模板,而sphinx-min.conf.dist没有注解说明,基实是一样的)复制到bin目录下(也可以其它目录,这里建议放在bin目录目的地为了后面不需要指定配置文件的路径),改名为sphinx.conf(其它也可以,你高兴就好);
1.3、打开sphinx.conf,进行相关的配置(详细的配置,可以看sphinx.conf.dist这个文件的注释说明,或自行网上找下说明),主要是配置MYSQL中的地址、账号、密码、指定数据库,编写想要索引的SQL等。
1.4、第一次,需运生全局生成索引文件(可以目录下添加DATA和LOG用来记录生成的索引文件和日志);
1.5、然后启动Sphinx,就可以通用其它客户端(PHP\PYTHON等)来读取了。
1.6、当然,距离你真正应用还有很多要做的。比如业务系统中添加、修改、删除了信息,都需要去更新Sphinx索引。
----------------------------------------
以下为我收集的文章:
以下内容来源于:sphinx3.1.1 window php入门实例:https://www.cnblogs.com/phper8/p/10967096.html
1.下载地址
http://sphinxsearch.com/downloads/current/
2.解压文件放到盘内
3.根目录创建 data 和 log 文件夹
4.复制 etc目录下的 min.conf 到 bin目录 并修改成 后缀.conf 文件
5.修改.conf内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# # Minimal Sphinx configuration sample (clean, simple, functional) # source src1 { type = mysql sql_host = 127.0.0.1 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,question \ FROM questions #sql_attr_uint = group_id #sql_attr_timestamp = date_added } index test1 { source = src1 path = E:/sphinx-3.1.1/data/test1 ngram_len = 1 ngram_chars = U+3000..U+2FA1F } indexer { mem_limit = 128M } searchd { listen = 9312 listen = 9306:mysql41 log = E:/sphinx-3.1.1/log/searchd.log query_log = E:/sphinx-3.1.1/log/query.log read_timeout = 5 max_children = 30 pid_file = E:/sphinx-3.1.1/log/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = E:/sphinx-3.1.1/data } |
6.生成文件
indexer --config demo.conf test1
7.开启sphinx服务
1
|
searchd --config demo.conf |
8.mysql 查询 创建的数据
1
|
mysql -h127.0.0.1 -P9306 |
9.PHP查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php $t1 = microtime(true); require ( "sphinxapi.php" ); $sphinx = new SphinxClient(); $sphinx ->setServer( '127.0.0.1' ,9312); $k = '酶' ; //搜索的关键字 $sphinx ->_limit = 100000; $res = $sphinx ->Query( $k , 'test1' ); $ids = array_keys ( $res [ 'matches' ]); $ids = implode( ',' , $ids ); $m = mysqli_connect( '127.0.0.1' , 'root' , 'root' , 'test' , '3306' ); mysqli_query( $m , 'set names utf8' ); $sql = "select * from questions where id in($ids)" ; $res = mysqli_query( $m , $sql ); while ( $row =mysqli_fetch_assoc( $res )) { $data [] = $row ; } $_arr = []; foreach ( $data as $key => $value ) { $val = str_replace ( $k , "<font color='red'>{$k}</font>" , $value [ 'question' ]); $arr [ 'id' ] = $value [ 'id' ]; $arr [ 'question' ] = $val ; $_arr [] = $arr ; } $t2 = microtime(true); echo '耗时' . round ( $t2 - $t1 ,3). '秒' ; echo '<pre>' ; var_dump( $_arr ); |
10.效果
11.对比mysql查询
-----------------------------------------
以下内容来源于:sphinx的更新与删除:https://my.oschina.net/osmyblog/blog/311556
索引文件的更新
思路:如果一条记录修改了,那么就为这条记录重新生成索引。新的记录的索引会覆盖原来旧的的记录的索引
1.创建一张表:记录所有被修改过的记录的ID
create table uprecord(
id int unsigned not null comment '修改过的记录的ID'
)
2.通过PHP程序记录下用户修改一条记录之后,把这条记录的ID插入到uprecord表中
3.修改sphinx的配置文件(修改增量索引的SQL语句)把修改过的记录也取出来,取出来之后就会把以前的索引给覆盖掉
4 清空uprecord表
sql_query_post =UPDATE a SET max_id=(SELECT max(id) FROM dede_archives);DELETE FROM uprecord;
索引文件的删除:
1 修改电影表添加一个字段用来标记是否删除:
alter table dede_archives add is_deleted unsigned not null default '0';
2 修改sphinx的配置文件,在电影的数据源上添加一个属性(必须)
#源定义
source mymovie
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = 123456
sql_db = dedecms831
sql_port = 3306
#命令行查询时,设置正确的字符集
sql_query_pre = SET NAMES utf8
sql_query = SELECT a.id,a.title,b.juqing FROM dede_archives a LEFT JOIN dede_addon7 b ON a.id=b.aid
#在索引创建好之后把最后一条记录的ID存放到A表中
sql_query_post =UPDATE a SET max_id=(SELECT max(id) FROM dede_archives)
sql_attr_bool =is_deleted //增加一个属性is_deleted
}
3 修改PHP的程序在查询SPHINX时只取出is_deleted属性为0的
$sp ->SetFilter("is_deleted", array(0)) //查询时,只查询出is_deleted等于0的记录
4 修改PHP的程序,当删除一条记录时
a.从数据库更新这条记录的is_deleted=1
b.更新SPHINX的删除属性为1:需要调用一个方法UpdateAttributes('is_deleted',array(5=>1)) 意思是设置id等于5的这条记录 将其is_deleted字段值设置为1,array()可以有多个
UpdateAttributes('is_deleted',array(5=>1,6=>1,8=>1))数组的键值代表记录的ID
5 在生成增量索引之后
a.可以删除is_deleted=1的从数据库中删除
sql_query_post = UPDATE a SET max_id=(SELECT max(id) FROM dede_archives);DELETE FROM uprecord;DELETE FROM dede_archives WHERE is_deleted='1';
b.修改合并的命令在合并时,添加一个参数is_deleted 只取is_deleted为0的记录.
C:\myenv\coreseek-3.2.14-win32\bin>indexer.exe -c C:\myenv\coreseek-3.2.14-win32\sphinx.conf
--merge mymovie mymovie_zl --merge-dst-range is_deleted 0 0 --roate
-
标签:Sphinx 发布于:2020-09-17 21:22:40
当前共有0条评论,我也要发表: