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 ...
随机推荐
- iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总
社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实 ...
- There is no Action mapped for namespace [/] and action name [Login] associated with context path [/e
近期学习web开发时,就遇到这个令人头疼的问题. 百度谷歌了N遍,最终在博客http://blog.csdn.net/liu578182160/article/details/17266879中找到了 ...
- Mac配置PHP开发环境
安装环境如下: Mac OS 10.10.1 Apache 2.4.9 PHP 5.5.14 MySQL 5.6.22 Apache配置 在Mac OS 10.10.1中是自带Apache软件的,我们 ...
- .net 导出带条码的PDF
Nuget添加引用:ZXing.Net生成条形码,ZXing.Net.Bindings.ImageSharp生成图片 将图片流插入单元格 举个栗子: BarcodeWriter writer = ne ...
- sqlserver 汉字转拼音
作者不详 --方法一sqlserver汉字转拼音首字母 --调用方法 select dbo.procGetPY ('中國') Create FUNCTION dbo.procGetPY ( ...
- getaddrinfo详解
#include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *restrict nodename ...
- 登入爱丽网后台(非JS绕过、非盲打、非IP欺骗)
后台: http://wed.27.cn/marry/marryadmin/web/login.php 不难猜解到后台管理的相关页面名称(不存在的页面服务器返回404,而存在的页面会直接跳转到上面的登 ...
- go语言基础之defer延迟调用
1.defer作用 关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行.注意,defer语句只能出现在函数或方法的内部. 运行场景: defer语句经常被用于处理成对的操作 ...
- go语言基础之switch语句 和 fallthrough 用途
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码: 示例1 ...
- 复习原生ajax
function ajax(url, fnSucc, fnFaild) { //1.创建 if(window.XMLHttpRequest) { var oAjax=new XMLHttpReques ...