欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

【原创】sphinx实时索引的配置及实际应用、实例

程序员文章站 2024-01-25 18:59:46
...

用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实时索引的配置及实际应用、实例

到这里表明实时索引服务已经启动,下面就是自己写程序往数据源添加内容了。
在此要特别说明一下:
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代码都没经过优化,只是很粗糙地完成了这个过程,实际的代码可能会封装成类/方法等等。

关于实时索引的建立及应用,到此结束。
如果大家有不同的建议,欢迎留言,大家一起交流!