sphinx学习

本文介绍了如何通过Sphinx搜索引擎优化MySQL中以%开头的LIKE查询,提高大数据量下的查询效率。首先,创建数据源和索引,然后配置Sphinx服务器,接着通过PHP调用SphinxAPI进行查询,最后展示增量索引的实现方式。
摘要由CSDN通过智能技术生成
简介

为何使用?
在mysql数据库中,对于如下sql语句,select * from xxx where xxx like ‘%xxx’(以%开头的like查询),无法使用到任何索引优化,导致如果数据量非常大,查询速度会非常慢
使用原理
(1)先创建数据源(一张表的select查询结果),
(2)根据数据源创建索引,使用分词技术。
(3)php把查询的关键词给sphinx服务器,sphinx根据关键词查找到关键字在mysql表里面的记录的id.sphinx把id返回给php查询端
(4)php根据返回的id,查询mysql服务器

如何使用?
  1. 创建数据源与索引位置
    复制etc/目录下的 csft_mysql.conf 一份到上一级目录,并改名为:shpinx.conf
    配置修改
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库

#源定义
source movie
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = root
    sql_db                  = sphinx
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8

    sql_query                = SELECT id, title, description FROM movie
    
}

#index定义
index movie
{
    source            = movie             #对应的source名称
    path            = E:/tools/sphinx/var/data/movie #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    docinfo            = extern
    mlock            = 0
    morphology        = none
    min_word_len        = 1
    html_strip                = 0

    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
    charset_dictpath = E:/tools/sphinx/etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    charset_type        = zh_cn.utf-8
}

#全局index定义
indexer
{
    mem_limit            = 128M
}

#searchd服务定义
searchd
{
    listen                  =   9312
    read_timeout        = 5
    max_children        = 30
    max_matches            = 1000
    seamless_rotate        = 0
    preopen_indexes        = 0
    unlink_old            = 1
    pid_file = E:/tools/sphinx/var/log/searchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    log = E:/tools/sphinx/var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    query_log = E:/tools/sphinx/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
}
  1. 创建索引
    indexer.exe –c配置文件 --all | 索引的名字
    在这里插入图片描述
  1. 启动sphinx服务器
    searchd -c sphinx的配置文件 --install
    在这里插入图片描述
    启动sphinx的服务。【启动端口9312】
    net start searchd
    在这里插入图片描述
  1. 将api文件复制到项目中
require_once 'sphinxapi.php';
$sc = new SphinxClient();
$sc->setServer('localhost', 9312);
$key = "空间";
//索引
$indexName = 'movie';
$sc->setMatchMode(SPH_MATCH_ANY);
$res = $sc->query($key, $indexName);
echo '<pre>';
print_r($res);
echo '</pre>';

结果:
在这里插入图片描述

$ids = implode(',', array_keys($res['matches']));
$pdo = new PDO('mysql:host=localhost;dbname=sphinx', 'root', 'root');
$res = $pdo->query("select id,title,description from movie where id in($ids)");
$data = $res->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $v) {
    $row = $sc->buildExcerpts($v, $indexName, $key, [
        'before_match' => "<font color='red'>",
        'after_match' => '</font>'
    ]);
    echo $row[1].'<br/>';
    echo $row[2]. '<hr/>';
    print_r($row);
}

在这里插入图片描述

增量索引

创建一个表用于记录当前查询索引的最大id
create table record(max_id int);
在sphinx.conf中添加
在这里插入图片描述
添加增量数据源与索引

#创建增量数据源
source movie_add
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = root
    sql_db                  = sphinx
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8

    sql_query                = SELECT id, title, description FROM movie where id > (select max_id from record)
    sql_query_post           = update record set max_id = (select max(id) from movie);
}

# 创建增量索引
index movie_add
{
    source            = movie_add             #对应的source名称
    path            = E:/tools/sphinx/var/data/movie_add #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    docinfo            = extern
    mlock            = 0
    morphology        = none
    min_word_len        = 1
    html_strip                = 0

    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
    charset_dictpath = E:/tools/sphinx/etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    charset_type        = zh_cn.utf-8
}

生成主索引
.\indexer.exe -c E:\tools\sphinx\sphinx.conf movie --rotate
生成增量索引
.\indexer.exe -c E:\tools\sphinx\sphinx.conf movie_add --rotate
在这里插入图片描述
把增量索引合并到主索引里面。
合并的语法:
indexer –c 配置文件 --merge 主索引文件 增量索引文件
indexer.exe –c E:\tools\sphinx\sphinx.conf --merge movie movie_add --rotate

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值