• Sphinx全文检索引擎测试


    数据表

    1documents

    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 ;

    2Sphinx

    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中共建立三个索引。

    1dramx   documents表的titlecontent字段均建立索引。

    2dramx_title  documents表的title字段建立索引。

    3dramx_content  documents表的content字段建立索引。

    三个索引在具体测试时,分别被用到。

     

     

     

    程序调用Sphinx全文检索引擎有两种方式:

    一、Php调用 API

    二、安装SphinxSE.

    安装方法:

    1、  在官网下载mysql-5.0.45-sphinxse-r871-win32.zip解压。

    2、  停掉本地mysql所有服务。并将解压后的文件覆盖到mysql相应目录。

    3、  启动mysql ,建立一个至少含有三个字段的表(sphinx),字段数据类型依次是intintvarchar

    Storage Engine选择sphinx即可。

    4、  查询时结合表sphinx进行联合查询。

     

    下面先将php+mysql Php+ Sphinx 通过like order by group by进行测试比较。最后单独给出使用第二种方法SphinxSE的查询测试。

     

     

    测试环境:

    内存:1GB  CPUintel 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;

    TitleContent 包含无线网卡厂商

    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;

    TitleContent 包含中国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;

    TitleContent 包含中国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;

    谢谢!

  • 相关阅读:
    python中单例模式
    python中常用的内置方法
    面向对象之反射
    绑定方法与非绑定方法
    python多态与抽象类
    python的组合与封装
    面向对象之继承与派生
    面向对象之类与对象
    python模块与包
    数据结构与算法_语言和框架特性前瞻和bug修复
  • 原文地址:https://www.cnblogs.com/zl0372/p/sphinx_13.html
Copyright © 2020-2023  润新知