Sphinx
1 下载sphinx
http://sphinxsearch.com/
2 编译安装
tar -zxvf sphinx.tar.gz
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql make && make install
Sphinx中重要的三个命令,(Sphinx安装的bin目录下)
Indexer 创建索引命令。Searchd 启动进程命令。Search 命令行搜索命令。
3 准备
导入example.sql
mysql -u test < /usr/local/sphinx/etc/example.sql
4 配置sphinx.conf
cp sphinx.conf.dist sphinx.conf
sphinx.conf包含几个代码段
主数据源:
source main{
}
增量数据源:
source delta:main{
}
主数据索引:
index main{
}
增量数据索引:
index delta:main{
}
分布式索引:
index dist1{
}
实时索引:
index rt{
}
索引器:
indexer{
}
服务进程:
searchd{
}
公用设置
common{
}
创建索引
Sphinx的配置文件配置完成,数据也做了,开始创建索引:
创建索引命令:indexer
-c 指定配置文件
--all 对所有索引重新编制索引
--rotate 用于轮换索引,主要是再不停止服务的时候,增加索引
--merge 合并索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all
如果报错:/usr/local/sphinx/bin/indexer: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
locate libmysqlclient 找到libmysqlclient.so.16文件路径
cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16
测试
检查数据命令:search
/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.conf test
Coreseek
安装:
http://www.coreseek.cn下载
解压并cd到mmseg目录:
./configure --prefix=/usr/local/mmseg
如果报cannot find input file: src/Makefile.in错运行automake
关于automake:http://blog.csdn.net/fb408487792/article/details/45391171
运行/usr/local/mmseg/bin/mmseg 有信息表示成功
cd到csft目录:
./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
make && make install
配置带有中文分词的sphinx配置文件
配置文件和上面的步骤一样,只不过是在coreseek中,有几个地方需要注意。
注意:coreseek中得配置文件是csft.conf,而不是sphinx.conf
cd /usr/local/coreseek/etc
cp sphinx.conf.dist csft.conf
vim csft.conf
其他地方都一样,对照下面不一样的地方修改
index test1
{
#stopwords = /data/stopwords.txt
#wordforms = /data/wordforms.txt
#exceptions = /data/exceptions.txt
#charset_type = sbcs
添加下面这两行,意思是把中文分词加入到配置文件中
charset_type = zh_cn.utf-8
charset_dictpath = /usr/local/mmseg/etc/ #你安装mmseg的目录
}
创建索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all
再次测试搜索中文
/usr/local/coreseek/bin/search [-a] -c /usr/local/coreseek/etc/csft.conf ‘配置‘
注意:如果你设置的coreseek配置文件为csft.conf,则inder、search和searchd时不用带上-c /usr/local/coreseek/etc/csft.conf,因为默认就是去寻找这个文件.
PHP去使用Sphinx
Sphinx集成到PHP程序中,有两种方式:
1.Sphinx php模块
2.Sphinxapi类
使用 Sphinx步骤:
1、首先得有数据
2、建立Sphinx配置文件
3、生成索引
4、启动Searchd服务进程,并开户端口9312
5、用PHP客户程序去连接Sphinx服务
一、启用sphinx服务
想要在程序中使用Sphinx必须开启Sphinx服务
启动进程命令: searchd
-c #指定配置文件
--stop #是停止服务
--pidfile #用来显式指定一个 PID 文件
-p #指定端口
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
注意:这里启动的服务是searchd,不是search
Sphinx默认的端口是9312端口
二、用PHP连接使用Sphinx程序
(1)全PHP加载Sphinx模块
wget http://pecl.php.net/get/sphinx-1.1.0.tgz
tar zxf sphinx-1.1.0.tgz
cd /www/soft/sphinx-1.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
如果提示: checking for libsphinxclient headers in default path... not found configure:
error: Cannot find libsphinxclient headers
libsphinxclient在csft/api/libsphinxclient
cd libsphinxclient/
./configure
make && make install
安装完libsphinxclient,继续安装sphinx扩展
cd /www/soft/sphinx-1.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
看到sphinx.so
vi /usr/local/webserver/php/etc/php.ini
加入extension = sphinx.so
/usr/local/apache2/bin/apachectl restart
测试Sphinx模块,http://127.0.0.1/phpinfo.php
(2)、使用API类连接Sphinx程序
需要到coreseek解压包中找到sphinxapi.php文件,拷贝到程序目录下
include 'sphinxapi.php'; $sphinx = new SphinxClient(); $sphinx->SetServer("localhost", 9312); #建立连接,第一个参数sphinx服务器地址,第二个sphinx监听端口 $result = $sphinx->query($keyword,"*"); #执行查询,第一个参数查询的关键字,第二个查询的索引名称,多个索引名称用,分开,也可以用*表示全部索引,其中包括增量索引 print_r($result);
while($row=$result->fetch_row()){ #循环体开始解析看下结果. 高亮我们需要用到 buildExcerpts 这个函数,php 手册中语法格式: public array SphinxClient::buildExcerpts ( array $docs , string $index , string $words [, array $opts ]) #返回的是一个数组,一共有四个参数 #第一个参数是从数据库中查询的结果集 #第二个参数是索引的名字 #第三个参数是要高亮显示的关键字 #第四个参数是显示的字格式化 $opts = array( #格式化摘要,高亮字体设置 #在匹配关键字之前插入的字符串,默认是<b> "before_match" => "<span style='font-weight:bold;color:red'>", #在匹配关键字之后插入的字符串,默认是</b> "after_match" => "</span>", #在摘要段落之前插入的字符串默认 ? "chunk_separator" => " ... ", ); $res=$sphinx->buildExcerpts($row,"index",$keyword,$opts); echo "<font size=4>".$res[0]."</font></a></br>"; 标题 echo "<font size=2>".$res[1]."</font></br>"; 摘要 echo $res[2]."</p>"; 添加时间 }
Source main{ #加一句sql_query_pre sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM post #并修改 sql_query= SELECT id,title, content FROM post WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) } 继承数据源: source delta : main { sql_query_pre = SET NAMES utf8 sql_query = SELECT id,title, content FROM post WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) } 主索引: #名字最好与数据源相应 Index main { source = main path = /usr/local/coreseek/var/data/main } 继承索引(也是增量索引) index delta:main { source= delta path= /usr/local/coreseek/var/data/delta }
index rt { type = rt rt_mem_limit = 512M path = @CONFDIR@/data/rt rt_field = title rt_field = content rt_attr_uint = gid } searchd{ listen = 9306:mysql41 #searchd支持mysql协议连接的端口 max_matches = 3000 #在mysql协议内查询出来的数据只会返回3000条,即使使用limit语句也是如此 }sphinx的实时索引配置本身并不需要数据源(source),它的数据是要通过程序利用mysql41协议的方式。
$keyword=$_POST['word']; $sphinx=new SphinxClient(); $sphinx->SetServer("localhost",9312); $sphinx->SetMatchMode(SPH_MATCH_ANY); //$sphinx->setLimits(0,0); $result=$sphinx->query("$keyword","*"); //echo "<pre>"; //print_r($result); //echo "</pre>"; $ids=join(",",array_keys($result['matches'])); mysql_connect("localhost","root","root"); mysql_select_db("test"); $sql="select * from post where id in({$ids})"; mysql_query("set names utf8"); $rst=mysql_query($sql); $opts=array( "before_match"=>"<button style='font-weight:bold;color:#f00'>", "after_match"=>"</button>" ); while($row=mysql_fetch_assoc($rst)){ $rst2=$sphinx->buildExcerpts($row,"main",$keyword,$opts); echo "{$rst2[0]}<br>"; echo "{$rst2[1]}<br>"; echo "{$rst2[2]}<br>"; }
原文地址:http://blog.csdn.net/fb408487792/article/details/45476823