用coreseek快速搭建sphinx中文分词搜索引擎 的文章链接为: http://blog.zhuyin.org/789.html 本文假设您已经建立好coreseek的普通索引应用了 下面基于这个基础,谈谈如何实现实时索引! #建立实时索引的配置文件 vi /usr/local/coreseek/etc/sphinx_index_r
用coreseek快速搭建sphinx中文分词搜索引擎 的文章链接为:
http://blog.zhuyin.org/789.html
本文假设您已经建立好coreseek的普通索引应用了
下面基于这个基础,谈谈如何实现实时索引!
#建立实时索引的配置文件
vi /usr/local/coreseek/etc/sphinx_index_rt.conf
index rtindex { type = rt path = /dev/shm/rtindex docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 rt_field = title rt_field = content rt_attr_uint = groupid rt_attr_bigint = biguid rt_attr_float = score rt_attr_timestamp = date_added rt_attr_string = author rt_attr_string = title rt_attr_string = content rt_mem_limit = 512M } searchd { workers = threads listen = 9312 listen = 127.0.0.1:9306:mysql41 read_timeout = 5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = /usr/local/coreseek/var/log/searchd_rtindex.pid log = /usr/local/coreseek/var/log/searchd_rtindex.log query_log = /usr/local/coreseek/var/log/query_rtindex.log binlog_path = /usr/local/coreseek/var/log/rtindex/ binlog_flush = 2 binlog_max_log_size = 16M }
上面的属性就不一一说了,只要留意
rt_field
rt_attr_uint
rt_attr_bigint
rt_attr_string
……
之类的就好,因为这些属性关系到您要索引的字段以及得到的结果是否包含这些字段的内容!
当然
rt_mem_limit
binlog_max_log_size
pid_file
之类的,请根据自己的实际环境设置好。
配置好上面的配置后
#实时索引不需要indexer!!,也就是不需要下面两句的命令了
#/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx_index_rt.conf –all
#/usr/local/coreseek/bin/search -c etc/csft.conf -a Twittter
#直接开启searchd /usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/sphinx_index_rt.conf #创建管理命令 echo '/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/sphinx_index_rt.conf' > /root/sphinx_start echo 'killall searchd' > /root/sphinx_stop echo 'killall searchd sleep 4 /usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/sphinx_index_rt.conf' > /root/sphinx_restart chmod 755 /root/sphinx*
这个时候您
ps awx|grep searchd
应该有以下的进程在跑了:
到这里表明实时索引服务已经启动,下面就是自己写程序往数据源添加内容了。
在此要特别说明一下:
sphinx的实时索引配置本身并不需要数据源(source),它的数据是要通过程序利用
localhost:9306:mysql41协议的方式,往里面加。
下面就写一段实际应用的php代码吧:
比如我有一个文章表 news 需要做实时索引
那在插入、删除、修改 news表的内容的同时,您得写一段类似下面的代码来对实时索引的内容进行更改:
//插入到news表的操作完成后 //连接到实时索引,使用MySQL41协议 $link = mysql_connect('127.0.0.1:9306') or die('connect bad'); if (!$link) { echo mysql_errno() . ": " . mysql_error(). "\n"; exit; } //$id应该是前面插入news表的时候返回的news_id。 $sql="INSERT INTO rtindex(id,title,content,groupid,biguid,score,date_added,author) VALUES ( $id, '$title', '$content', $groupid,$biguid,$score,$date_added,'$author')"; mysql_query($sql); if(mysql_errno()) { echo mysql_errno() . ": " . mysql_error(). "\n"; echo $sql; exit; }
在做实时索引查询的时候,php代码如下
//连接到实时索引,使用MySQL41协议 $link = mysql_connect('127.0.0.1:9306') or die('connect bad'); if (!$link) { echo mysql_errno() . ": " . mysql_error(). "\n"; exit; } $query=mysql_query("SELECT * FROM rtindex WHERE MATCH('你好吗??')"); if(mysql_errno()) { echo mysql_errno() . ": " . mysql_error(). "\n"; exit; } while($row=mysql_fetch_array($query,MYSQL_ASSOC)) { print_r($row); } die;
当然,上面的php代码都没经过优化,只是很粗糙地完成了这个过程,实际的代码可能会封装成类/方法等等。
关于实时索引的建立及应用,到此结束。
如果大家有不同的建议,欢迎留言,大家一起交流!
原文地址:【原创】sphinx实时索引的配置及实际应用、实例, 感谢原作者分享。