Sphinx 实现海量数据的快速查询

说到 Sphinx,就会想到:站内搜索mysql优化分词 等等有关搜索海量数据的需求,本文介绍了 sphinx的基本概念、安装、和一个联系动态语言实现大数据海量查询的实例。

1. Sphinx的基本概念

Sphinx 是一个 全文检索引擎。意图为其他应用提供 高速、低空间占用、高结果相关度全文搜索功能Sphinx 可以非常容易的与 SQL 数据库和脚本语言集成。当前系统内置 MySQLPostgreSQL 数据库数据源的支持 。

也就是可以在 sphinx.conf 文件中进行以上数据库源的配置,同时,Sphinx 也支持从标准输入读取特定格式 的 XML 数据。

Sphinx 可以高效的创建索引,速度达到 10MB/S ,可以配合 Coreseek 达到 中文 分词


2. 安装/使用

使用

①、采用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.confsource src1 下面几行。

3. 配置 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 ### 是否支持无缝切换,做增量索引时通常需要
}

4. 使用配置好的sphinx 创建索引

这里要用到 index ,命令,这里会用到之前的配置文件,会生成在之前配置的路径下。

bin/indexer -c etc/sphinx.conf article ### 建立索引文件的命令

5. 查询 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中文站

你可能感兴趣的:(linux,php,sql,数据库,大数据,海量数据,sphinx)