Linux 下编译安装 Sphinx

编译安装 Sphinx

  • 安装相关依赖包
yum -y install gcc gcc-c++ automake autoconf expat expat-devel mysql-devel
  • 下载最新的 Sphinx 正式版源码包
cd /usr/local/src
wget -c http://sphinxsearch.com/files/sphinx-2.2.11-release.tar.gz
  • 解压缩
tar zxvf sphinx-2.2.11-release.tar.gz
  • 编译三部曲
# 进入源码目录
cd sphinx-2.2.11-release

# 配置指定安装目录 
./configure --prefix=/usr/local/sphinx --with-mysql --with-libexpat --enable-id64

# 配置安装 && 编译安装
make && make install

安装依赖 libsphinxclient

cd api/libsphinxclient

# 配置指定安装目录
./configure --prefix=/usr/local/sphinx/libsphinxclient

# 配置安装 && 编译安装
make && make install

安装 PHP7 的 Sphinx 扩展

cd /user/local/src
wget http://git.php.net/?p=pecl/search_engine/sphinx.git;a=snapshot;h=d958afb6c587f08eee37602dbd8518afdcd72916;sf=tgz
  • 解压缩
tar zxvf sphinx-d958afb.tar.gz
  • 编译三部曲
# 进入源码目录
cd sphinx-d958afb

# 通过 phpize 建立 php 的外挂模块,生成 configure
phpize

# 配置指定安装目录 
./configure --with-sphinx=/usr/local/sphinx/libsphinxclient/ --with-php-config=/usr/local/php/bin/php-config

# 配置安装 && 编译安装
make && make install
  • 配置 Sphinx 扩展
# 配置 php.ini
echo "[sphinx]" >> /usr/local/php/etc/php.ini
echo "extension = sphinx.so" >> /usr/local/php/etc/php.ini

# 重启 Nginx 和 PHP
systemctl restart nginx
/etc/init.d/php-fpm restart

创建索引测试

  • 创建 sphinx 配置文件
cd /usr/local/sphinx/etc/
cp sphinx-min.conf.dist sphinx.conf
vim sphinx.conf
  • 配置示例
#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source student_src
{
    type            = mysql

    sql_host        = localhost
    sql_user        = root
    sql_pass        = asdf
    sql_db          = laravel
    sql_port        = 3306
    # 指定sock文件
    sql_sock		= /tmp/mysql.sock
    sql_query_pre = SET NAMES utf8
    sql_query_pre = SET SESSION query_cache_type = OFF
    sql_query       = \
        SELECT id, name, age, gender,created_at, updated_at FROM student
	
	# 以下是用来过滤或条件查询的属性,这里列出的字段将可以进行条件查询,同时不参与全文检索
    #sql_attr_uint      = group_id
    #sql_attr_timestamp = date_added
}


index student
{
    source          = student_src
    path            = /usr/local/sphinx/var/data/student

    docinfo = extern  
    mlock = 0  
    morphology = none  
    min_word_len = 1

    #charset_type = utf-8

    #charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

    ngram_len = 1  
    ngram_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF,U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF,U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF,U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF
}

indexer
{
    mem_limit       = 128M
}


searchd
{
    listen          = 9312
    listen          = 9306:mysql41
    log         	= /usr/local/sphinx/var/log/searchd.log
    query_log       = /usr/local/sphinx/var/log/query.log
    read_timeout	= 5
    max_children	= 30
    pid_file        = /usr/local/sphinx/var/log/searchd.pid
    seamless_rotate	= 1
    preopen_indexes	= 1
    unlink_old      = 1
    workers         = threads # for RT to work
    binlog_path     = /usr/local/sphinx/var/data
}
  • 创建索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf student
  • 设置开机启动
vim /etc/rc.local
# 写入以下内容
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf
  • PHP 测试代码
<?php
$keyword = 'Jerry';
$cl = new SphinxClient();
$cl->SetServer('127.0.0.1', 9312);
#$cl->SetMatchMode(SPH_MATCH_EXTENDED);
$index = "student";
$res = $cl->Query($keyword, $index);
$err = $cl->GetLastError();

echo "<pre>";
print_r($res);

Sphinx 增量索引和主索引来实现索引的实时更新

实现原理
新建一张表,记录上一次已经创建好的索引的最后一条记录的 doc_id
当索引时,然后从数据库中取出所有 doc_id 大于上面那个 Sphinx 中的那个 doc_id 的数据,然后创建一个小的索引文件
把创建的增量索引文件合并到主索引文件上去
把最后一条记录的 doc_id 更新到第一步创建的表中
注意点
当合并索引的时候,只是把增量的索引合并进主索引中,增量索引本身并不会变化,也不会被删除
当重建主索引的时候,增量索引就会被删除;

实现流程

  • 新建一张表,用于存储已经建过索引的最大的 doc_id
CREATE TABLE `sph_counter` (
  `counter_id` int(11) NOT NULL COMMENT '标识不同的数据表',
  `max_doc_id` int(11) NOT NULL COMMENT '每个索引表的最大ID,会实时更新',
  PRIMARY KEY (`counter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 配置索引文件
## 编辑配置文件
vim /usr/local/sphinx/etc/sphinx.conf

## 修改以下内容

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

# 主索引数据源定义
source student
{
    type            = mysql
    sql_host        = localhost
    sql_user        = root
    sql_pass        = asdf
    sql_db          = laravel
    sql_port        = 3306
    # 指定sock文件
    sql_sock		= /tmp/mysql.sock	
    sql_query_pre 	= SET NAMES utf8
    sql_query_pre 	= SET SESSION query_cache_type = OFF
    sql_query_pre 	= REPLACE INTO sph_counter SELECT 1, MAX(id) FROM student
    sql_query       = \
        SELECT id, name, age, gender,created_at, updated_at FROM student \
        WHERE id< (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1)
	# 从 MySQL 读取到的值必须为整数,作为时间戳属性
	sql_attr_timestamp	= updated_at	
	
	# 以下是用来过滤或条件查询的属性,这里列出的字段将可以进行条件查询,同时不参与全文检索
    # sql_attr_uint      = group_id
    # sql_attr_timestamp = date_added
}

# 增量索引数据源定义
source student_delta : student
{	
	sql_sock		= /tmp/mysql.sock
	sql_query_pre   = SET NAMES utf8
   	sql_query       = \
		SELECT id, name, age, gender,created_at, updated_at FROM student \
        WHERE id >= (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1)
	 
}

# 主索引 index 定义
index student
{
    source          = student
    path            = /usr/local/sphinx/var/data/student

    docinfo 		= extern  
    mlock 			= 0  
    morphology 		= none  
    min_word_len 	= 1
    html_strip		= 0

    #charset_type = utf-8

    #charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

    ngram_len = 1  
    ngram_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF,U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF,U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF,U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF
}

# 增量索引 index 定义
index student_delta : student
{
    source 			= student_delta
    path            = /usr/local/sphinx/var/data/student_delta
    docinfo			= extern
    mlock			= 0
    morphology		= none
    min_word_len	= 1
    html_strip		= 0

    #charset_type = utf-8

    #charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

    ngram_len = 1  
    ngram_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF,U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF,U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF,U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF
}

indexer
{
    mem_limit       = 128M
}


searchd
{
    listen          = 9312
    log         	= /usr/local/sphinx/var/log/searchd.log
    query_log       = /usr/local/sphinx/var/log/query.log
    read_timeout	= 5
    max_children	= 30
    pid_file        = /usr/local/sphinx/var/log/searchd.pid
    seamless_rotate	= 1
    preopen_indexes	= 1
    unlink_old      = 1
    workers         = threads # for RT to work
    # binlog_path     = /usr/local/sphinx/var/data
}
  • 索引设置
# 重启 searchd 进程
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf --stop
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf

# 重新加载索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate

# 加载增量索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf student_delta --rotate

# 合并索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --merge student student_delta --rotate

# 增量索引可以在 crontab 里根据需求设置几分钟运行一次,然后执行索引合并,
# 主索引重建可以在半夜运行
crontab -e
# 每5分钟运行增量索引
*/5 * * * /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf student_delta --rotate

#凌晨0点5分重新建立主索引
5 0 * * * /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值