Sphinx全文检索引擎测试
数据表
1、documents
CREATE TABLE `documents` (
`id` int(13) NOT NULL auto_increment,
`group_id` int(11) NOT NULL,
`group_id2` int(11) NOT NULL,
`date_added` datetime NOT NULL,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`),
KEY `title` (`title`),
FULLTEXT KEY `content` (`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=500006 ;
2、Sphinx
CREATE TABLE `sphinx` (
`id` int(13) NOT NULL,
`weight` int(11) NOT NULL,
`query` varchar(255) NOT NULL,
KEY `Query` (`query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8;
本次测试,在sphinx.conf中共建立三个索引。
1、dramx 对 documents表的title、content字段均建立索引。
2、dramx_title 对 documents表的title字段建立索引。
3、dramx_content 对 documents表的content字段建立索引。
三个索引在具体测试时,分别被用到。
程序调用Sphinx全文检索引擎有两种方式:
一、Php调用 API
二、安装SphinxSE.
安装方法:
1、 在官网下载mysql-5.0.45-sphinxse-r871-win32.zip解压。
2、 停掉本地mysql所有服务。并将解压后的文件覆盖到mysql相应目录。
3、 启动mysql ,建立一个至少含有三个字段的表(sphinx),字段数据类型依次是int、int、varchar,
Storage Engine选择sphinx即可。
4、 查询时结合表sphinx进行联合查询。
下面先将php+mysql和 Php+ Sphinx 通过like 、order by 、group by进行测试比较。最后单独给出使用第二种方法SphinxSE的查询测试。
测试环境:
内存:1GB 、CPU:intel pentium(R) dual CPU E2140
数据量:50万条
|
测试项目 |
Php+Mysql |
Php + Sphinx 全文检索引擎 |
||
|
所花时间(秒) |
代码 |
所花时间 |
代码 |
|
|
Title like ‘%Fm5%’ |
0.93 |
mysql_query('set names utf8'); $sql = "select title from documents where title like '%Fm5%'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.012 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); //搜索模式均采用匹配所有查询词模式 $cl->SetLimits(0,100000); $res = $cl->Query('Fm5', 'dramx_title'); $end = getmicrotime(); print_r($res); print $end-$start; |
|
Content Like ‘%中国LED照明市场%’ |
11.75 |
mysql_query('set names utf8'); $sql = "select title from documents where content like '%中国LED照明市场%'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.020 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetLimits(0,100000); $res = $cl->Query('中国LED照明市场', 'dramx_content'); $end = getmicrotime(); print_r($res); print $end-$start; |
|
MATCH (content) AGAINST ('无线网卡厂商') |
0.93 |
mysql_query('set names utf8'); $sql = "select title from documents where MATCH (content) AGAINST ('无线网卡厂商')"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.020 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetLimits(0,100000); $res = $cl->Query('无线网卡厂商', 'dramx_content'); $end = getmicrotime(); print_r($res); print $end-$start; |
|
MATCH (content) AGAINST ('產業資訊') 并按照 id 排序(Order By id desc) |
1.50 |
mysql_query('set names utf8'); $sql = "select title from documents where MATCH (content) AGAINST ('產業資訊') order by id desc"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.031 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetSortMode(SPH_SORT_EXTENDED, 'id desc'); $cl->SetLimits(0,100000); $res = $cl->Query('產業資訊', 'dramx'); $end = getmicrotime(); print_r($res); print $end-$start; |
|
MATCH (content) AGAINST ('专题报道') 并根据group_id分组(Group By group_id ) |
1.01 |
mysql_query('set names utf8'); $sql = "select title from documents where MATCH (content) AGAINST ('专题报道') group by group_id"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.081 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetGroupBy('group_id', SPH_SORT_ATTR_DESC,"@group desc "); $cl->SetLimits(0,100000); $res = $cl->Query('专题报道台', 'dramx'); $end = getmicrotime(); print_r($res); print $end-$start; |
|
Content Like ‘%中国LED照明市场%’ order by id desc |
52.54 |
mysql_query('set names utf8'); $sql = "select title from documents where content like '%中国LED照明市场%' order by id desc"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.031 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetSortMode(SPH_SORT_EXTENDED, 'id desc'); $cl->SetLimits(0,100000); $res = $cl->Query(中国LED照明市场', 'dramx'); $end = getmicrotime(); print_r($res); print $end-$start; |
|
Content Like ‘%国际Dram报价平台%’ group by group_id desc |
40.05 |
$sql = "select title from documents where content like '%中国LED照明市场%' group by group_id"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
0.081 |
$cl = new SphinxClient (); //设置连接Sphinx主机名与端口 $start = getmicrotime(); $cl->SetServer('localhost',3312); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetGroupBy('group_id', SPH_SORT_ATTR_DESC,"@group desc "); $cl->SetLimits(0,100000); $res = $cl->Query('国际Dram报价平台', 'dramx'); $end = getmicrotime(); print_r($res); print $end-$start; |
针对php+mysql的查询,mysql-nt进程占用CPU的峰值最高到50%, 一般在20%之间,而php+Sphinx由于查询时根本没有用到mysql引擎而是查询自身的索引引擎,所以,在查询上CPU的占用可以忽略。
SphinxSE性能测试
|
测试项目 |
SphinxSE |
|
|
所花时间(秒) |
代码 |
|
|
Title 包含 ‘Dramexchange 国际Dram报价平台’ |
0.045 |
mysql_query('set names utf8'); $sql = "select c.* from documents as c,sphinx as t where c.id=t.id and t.query='@title 国际Dram报价平台;mode=extended'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
|
Content 包含 国际Dram报价平台 |
0.043 |
mysql_query('set names utf8'); $sql = "select c.* from documents as c,sphinx as t where c.id=t.id and t.query='@content 国际Dram报价平台;mode=extended'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
|
Title、Content 包含无线网卡厂商 |
0.016 |
mysql_query('set names utf8'); $sql = "select c.* from documents as c inner join sphinx as t on c.id=t.id where t.query='包含无线网卡厂商'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
|
Title、Content 包含’中国LED照明市场’并按照group_id排序 |
0.052 |
mysql_query('set names utf8'); $sql = "select c.* from documents as c inner join sphinx as t on c.id=t.id where t.query='中国LED照明市场;mode=extended;sort=extended:group_id desc'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
|
Title、Content 包含’中国LED照明市场’并按照group_id 分组 |
0.052 |
mysql_query('set names utf8'); $sql = "select c.* from documents as c inner join sphinx as t on c.id=t.id where t.query='中国LED照明市场;mode=extended;groupby=attr:group_id'"; $start = getmicrotime(); $result = mysql_query($sql) or die(mysql_error()); $end = getmicrotime(); print mysql_num_rows($result).'<br>'; print $end-$start; |
谢谢!
Sphinx全文检索引擎测试的更多相关文章
- sphinx全文检索引擎
今天刚刚学习了一下,就直接分享上去,有些还没有接触,如果有问题请指正,谢谢 sphinx是什么? Sphinx是一个全文检索引擎.主要为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能. S ...
- centos7下搭建sphinx全文检索引擎
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索.Sphinx特别为一些 ...
- Sphinx全文检索
全文检索 一.生活中的数据总体分为: 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据:指没有固定格式或不定长的数据,如邮件,word文档等. 非结构化数据还有一种叫法: ...
- sphinx全文检索功能 | windows下测试 (一)
前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在* ...
- 全文检索引擎 sphinx-coreseek中文索引
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索. Sphinx特别为一些 ...
- Sphinx 全文检索
什么是全文检索: 全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术.检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容. 简介: Sphinx是由俄罗斯人And ...
- Coreseek/sphinx全文检索的了解
Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的随意内容信息查找出来的检索.它能够依据 ...
- Solr全文检索引擎配置及使用方法
介绍 Solr是一款开源的全文检索引擎,基于lucene.拥有完善的可配置功能界面.具有丰富的查询语言,可扩展,可优化. 下载安装 进入solr官网下载包(这里我使用的版本是8.0) http://w ...
- 全文检索引擎在Django中的使用
Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...
随机推荐
- qt程序运行时的错误error:undefined reference to `_imp___ZN10QTcpSocketD1Ev'
出现的错误: undefined reference to `_imp___ZN10QTcpSocketD1Ev' undefined reference to `_imp___ZN10QTcpSoc ...
- react-native-communications 电话、短信、邮件、浏览器
第一种方法:Linking:调用系统的电话.短信.邮件.浏览器等功能 Linking.canOpenURL(this.props.url).then(supported => { if (!su ...
- javascript 手机号间隔显示 123 4567 8910
// 手机号分隔显示 let tel = this.data.tel_value // 原始手机号 let len = tel_value.length // 原始手机号的长度 let mobile ...
- 字符集UTFMB4
http://my.oschina.net/leejun2005/blog/232732#OSC_h3_4 http://ju.outofmemory.cn/entry/211473
- Gulp插件autoprefixer的使用
1.创建:gulpfile.js //引入插件 var gulp = require('gulp'); var autoprefixer = require('gulp-autoprefixer'); ...
- 嵌入式linux内核和根目录制作
系统组成:Bootloader, Boot parameters, Kernel, Root filesystem嵌入式linux系统有linux内核与根文件系统两部分构成,两者缺一不可. 内核制作: ...
- 百度地图js小结
1.获取javascript API 服务方法,首先申请密钥(ak),才可成功载入APIJS文件. 用法例如以下: <script type="text/javascript" ...
- 深度学习Deep learning
In the last chapter we learned that deep neural networks are often much harder to train than shallow ...
- jenkins错误413 Request Entity Too Large<
jenkins-nginx--sonar1/sonar2
- (Inside Out) Web地图坐标系——TDT的奇妙
一个GIS科班出生的研究生.把已还到课本的基础GIS知识,准备又一次学习,并结合这几年下来自身在行业中GIS的应用.总结一些有用的GIS知识点.一备不时之需,二为积累沉淀,三则是年龄越大.记性越差,加 ...