Sphinx
,就会想到:站内搜索
,mysql优化
,分词
等等有关搜索海量数据的需求,本文介绍了 sphinx
的基本概念、安装、和一个联系动态语言实现大数据海量查询的实例。Sphinx
是一个 全文检索引擎
。意图为其他应用提供 高速、低空间占用、高结果相关度 的全文搜索功能
。Sphinx
可以非常容易的与 SQL
数据库和脚本语言集成。当前系统内置 MySQL
和 PostgreSQL
数据库数据源的支持 。
也就是可以在
sphinx.conf
文件中进行以上数据库源的配置,同时,Sphinx
也支持从标准输入读取特定格式 的XML
数据。
Sphinx
可以高效的创建索引,速度达到 10MB/S ,可以配合 Coreseek
达到 中文 分词
使用
①、采用API调用,如使用PHP、java等的API函数或方法查询。优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用;
本文介绍的就是这种方法
②、使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索。其特点是,在sql端方便组合,且能直接返回数据给客户端
这种方式对于 ORM 方式的sql 不是很友好 ,且需要 mysql 5.1 以上的版本
安装
本文以 Ubuntu 14.04
作为例子介绍安装方法:
依赖:mysql ,可以参考我的另外一篇博客:安装方法 :在ubantu14下搭建lamp的再次记录
安装代码
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz
tar -xvzf sphinx-0.9.8-rc2.tar.gz
cd sphinx-0.9.8-rc2
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
make
make install
/*运行测试*/
$ cd /usr/local/sphinx/etc
$ cp sphinx.conf.dist sphinx.conf
$ vi sphinx.conf
这里,Sphinx
提供了一个简单的例子,基本步骤是先将 /sphinx/etc
下面的 sphinx.conf.dist
重命名为 sphinx.conf
,然后修改 sphinx.conf
其中的配置,命令如下:
cd /usr/local/sphinx/etc #进入sphinx的配置文件目录
cp sphinx.conf.dist sphinx.conf #新建Sphinx配置文件
可以在 Sphinx.conf
中配置你服务器上面的 mysql
的用户名、密码、使用的数据库等。修改的位置 是 sphinx.conf
的 source src1
下面几行。
Sphinx.conf
Sphinx
需要根据数据库的参数来进行配置,先查看 mysql
相关参数
Mysql server:192.168.1.10
Mysql db :test
Mysql 表:test.sphinx_article
mysql> desc sphinx_article;
+———–+———————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———–+———————+——+—–+———+—————-+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(255) | NO | | | |
| cat_id | tinyint(3) unsigned | NO | MUL | | |
| member_id | int(11) unsigned | NO | MUL | | |
| content | longtext | NO | | | |
| created | int(11) | NO | MUL | | |
+———–+———————+——+—–+———+—————-+
6 rows in set (0.00 sec)
根据以上的配置 ,Sphinx.conf
中可以进行如下几种类型的配置:
##### 索引源 ###########
source article_src
{
type = mysql #####数据源类型
sql_host = 192.168.1.10 ######mysql主机
sql_user = root ########mysql用户名
sql_pass = pwd############mysql密码
sql_db = test #########mysql数据库名
sql_port= 3306 ###########mysql端口
sql_query_pre = SET NAMES UTF8 ###mysql检索编码,特别要注意这点,很多人中文检索不到是数据库的编码是GBK或其他非UTF8
sql_query = SELECT id,title,cat_id,member_id,content,created FROM sphinx_article ####### 获取数据的sql
#####以下是用来过滤或条件查询的属性############
sql_attr_uint = cat_id ######## 无符号整数属性
sql_attr_uint = member_id
sql_attr_timestamp = created ############ UNIX时间戳属性
sql_query_info = select * from sphinx_article where id=$id ######### 用于命令界面端(CLI)调用的测试
}
### 索引 ###
index article
{
source = article_src ####声明索引源
path = /usr/local/sphinx/var/data/article #######索引文件存放路径及索引的文件名
docinfo = extern ##### 文档信息存储方式
mlock = 0 ###缓存数据内存锁定
morphology = none #### 形态学(对中文无效)
min_word_len = 1 #### 索引的词最小长度
charset_type = utf-8 #####数据编码
##### 字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,
##### 即进行字索引,若要使用中文分词,必须使用其他分词插件如 coreseek,sfc
######### 索引器配置 #####
indexer
{
mem_limit = 256M ####### 内存限制
}
############ sphinx 服务进程 ########
searchd
{
#listen = 9312 ### 监听端口,在此版本开始,官方已在IANA获得正式授权的9312端口,以前版本默认的是3312
log = /usr/local/sphinx/var/log/searchd.log #### 服务进程日志 ,一旦sphinx出现异常,基本上可以从这里查询有效信息,轮换(rotate)出的问题一般可在此寻到答案
query_log = /usr/local/sphinx/var/log/query.log ### 客户端查询日志,笔者注:若欲对一些关键词进行统计,可以分析此日志文件
read_timeout = 5 ## 请求超时
max_children = 30 ### 同时可执行的最大searchd 进程数
pid_file = /usr/local/sphinx/var/log/searchd.pid #######进程ID文件
max_matches = 1000 ### 查询结果的最大返回数
seamless_rotate = 1 ### 是否支持无缝切换,做增量索引时通常需要
}
这里要用到 index
,命令,这里会用到之前的配置文件,会生成在之前配置的路径下。
bin/indexer -c etc/sphinx.conf article ### 建立索引文件的命令
sphinx
创建的索引数据search
###### 在article索引上检索 “北京”关键词 ########
bin/search -c etc/sphinx.conf 北京
这里如果使用远程连接,需要将字符设置成utf8 编码。
动态语言访问
,此处使用 php 作为api 语言 ### 使sphinx在后台运行
bin/searchd -c etc/sphinx.conf &
####
php测试代码:
require “sphinxapi.php”;
$cl = new SphinxClient();
$cl->SetServer(’192.168.1.150′, 9312); //注意这里的主机
#$cl->SetMatchMode(SPH_MATCH_EXTENDED); //使用多字段模式
//dump($cl);
$index=”article”;
$res = $cl->Query($keyword, $index);
$err = $cl->GetLastError();
dump($res);
function dump($var)
{
echo ‘<pre>’;
var_dump($var);
echo ‘</pre>’;
}
?>
参考连接:Sphinx中文站