sphinx /coreseek 一站式搭建和 PHP 检索教程

Sphinx / coreseek 从懵逼到入门一站式不完全指南

本文内容:

主要解决以下问题:

Sphinx / coreseek 是什么,它解决什么问题,什么情况下我应该使用它,如何使用 ?

前置知识:

1、有 Linux 的命令行的基本编译使用经验

2、熟悉 php 的基本语法

3、熟悉 php 开发环境的搭建

Sphinx / coreseek 简介

Sphinx / coreseek 是一款全文搜索引擎。主要解决海量数据的检索问题。

coreseek 是国人在 Sphinx 基本上开发的支持中文分词等强大功能的解决方案 - 可以看做是 Sphinx for chinese ^^

核心组件和工作原理概述

在这里插入图片描述

在 coreseek 安装完毕之后 ( 后文会有详细的编译安装过程,这里只做了解即可 ),会有以下的执行文件位于: 安装目录/coreseek/bin 下面:

indexer indextool search searchd spelldump

一、其中 indexer 为建立索引的工具,可以用于建立倒排索引,即图中的步骤 1

二、searchd 为搜索守护进程, 用于和编程语言通讯完成查询操作, 即步骤 2、3

三、step 二之后, 返回的是 MySQL (或者其他数据库,本文的数据源是来自 MySQL )数据表的主键,然后根据主键去数据库查询需要的字段即可。

作业环境:

操作系统: centos 6

软件:PHP 5.6.36 、MySQL 5.5.60、coreseek4.1 beta

安装配置

先下载 coreseek4.1:https://download.csdn.net/download/u010620626/10696385

注意:

后面的操作,如无特殊说明,均是使用 root 身份执行,若在执行命令的过程中遇到报错,参见文末常见错误的解决方法。

# 1、解压并切换到解压后的目录
tar -zxf coreseek-4.1-beta.tar.gz
cd coreseek-4.1-beta
ll
# 解压后可以看到有以下文件 csft-4.1  mmseg-3.2.14  README.txt  testpack

# 2、编译分词软件包 mmseg ( 更多关于 mmseg 信息,见文章底部附录)
cd mmseg-3.2.14
./bootstrap
./configure --prefix=/usr/local/mmseg3
make
make install

# 3、安装 coreseek 
1) cd ../csft-4.1/
2) sh buildconf.sh
3) ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql

# 为了避免后面产生一个 libiconv 类型的错误,这里直接修改,节约一个编译的时间
4) vim src/Makefile
将 249 行从 "LIBS = -ldl -lm -lz -lexpat  -L/usr/local/lib -lrt  -lpthread" 修改为 "LIBS = -ldl -lm -lz -lexpat -liconv  -L/usr/local/lib -lrt  -lpthread"

5) make && make install

# 4、这里为止,大部分的安装工作 (后文还有一个 php 连接 sphinx 的客户端编译和 sphinx 索引配置相关的工作) ,我们来针对分词功能进行一些测试
cd ../testpack/
cat var/test/test.xml # test.xml 中有一些用来测试分词的中文
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml # 使用 mmseg 对 test.xml 的语料进行分词
/usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索

出现如下的结果,说明一切正常

在这里插入图片描述

PHP 和 Sphinx 进行通讯有两种可选方式:

1、在 PHP 所在的环境安装 libsphinxclient 依赖 (推荐)

2、inlude 解压目录 coreseek-4.1-beta/testpack/api/sphinxapi.php 文件后使用。

为了配合框架的命名空间和保持代码的风格一致性,( 而且我偷偷臆测可能使用编译类库的性能要好些,没有测试 ), 于是我使用的第一个方式。

# 1、安装 sphinxclient 扩展,切换到 libsphinxclient 目录,根据自己实际环境酌情修改,后文如无特殊说明,所有路径都是根据自己的环境酌情修改
cd coreseek-4.1-beta/testpack/api/libsphinxclient 
./configure  --prefix=/usr/local/sphinxclient
make && make install

# 2、安装 sphinx PHP 扩展
wget -c http://pecl.php.net/get/sphinx-1.3.3.tgz # 最新的 sphinx 扩展可以在 pecl 官网下载 http://pecl.php.net, 截止发文 1.3.3 的扩展适用于 PHP 5.2.2 - 6.0.0 版本
tar -zxf sphinx-1.3.3.tgz
cd sphinx-1.3.3.tgz
phpize # 如果 phpize 不在环境变量中则需指定完整路径
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinxclient # 注意这里 with-php-config 参数填写自己的实际 php-config 文件路径, with-sphinx 后填写步骤 1 中 sphinxclient 指定的安装路径
make && make install

# 3、在 php.ini 中添加 sphinx 扩展 
extension=sphinx.so

# 4、确认扩展安装成功
php -m | grep sphinx # 看到红色的 sphinx 字样说明安装成功

索引配置

接下来,讲解索引配置文件的构成和作用。

行文思路:

1、先看到的结构块,做到对构成成分有大体的把握

2、再针对各个结构快详细进行讲解

vim /usr/local/coreseek/etc/sphinx.conf.dist # 下面我们使用这个文件来讲解 sphinx 配置文件

# 数据源
# 主要作用: 指定要索引数据源及该数据源的其他一些参数,比如数据类型 (Mysql 、xml 等),连接的账户密码等
source src1 # source 关键字配置数据数据源, src1 可以是任意合法的变量名
{
    
}

# 索引  
# 主要作用: 创造索引需要的一些条件,如:指定索引的数据源,分词词库目录和数据编码等
index test1 # index 关键字配置索引, test1 名称可以按需要指定
{
    
}

# 构建索引的服务
indexer # 索引服务的一些配置,后文我们将在这里限制索引时能使用的最大内存
{
    
}

# 搜索服务的守护进程
#主要作用:对守护进程进行一些配置,比如守护进程的监听端口日志文件的路径等
searchd # 对应 searchd 守护进程的一些配置
{
    
}

下面再具体讲解

这是我们用于测试的最小配置

# 数据源
source main
{
# 数据(库)类型
type=mysql 
# host
sql_host=127.0.0.1
# 用户
sql_user=root
# 密码
sql_pass=root
# 数据库
sql_db=test
# 端口
sql_port=3306
# 在 sql_query 之前执行
sql_query_pre=set names utf8
sql_query=select id, title from news
# 适用于命令行
sql_query_info=select id, title from news
}

# 索引
index ind_main
{
source=main
path=/usr/local/coreseek/var/data/ind_main/
charset_type=zh_cn.utf-8
charset_dictpath=/usr/local/mmseg/etc
}

# 索引服务
indexer
{
	# 设置最大索引时内存限制大小
	mem_limit=128M
}

# 搜索守护进程
searchd
{
	listen=9312
	listen=9306:mysql41
	read_timeout=5
	max_children=30
	max_matches=1000
	seamless_rotate=0
	preopen_indexes=0
	unlink_old=1
	pid_file=/usr/local/coreseek/var/log/searchd_mysql.pid
	log=/usr/local/coreseek/var/log/searchd_mysql.log
	query_log=/usr/local/coreseek/var/log/query_mysql.log
}

# 如果需要了解更多的配置项: https://hackoops.com/476.html

PHP + coreseek 的示范

1、建立测试 MySQL 数据

下面是测试要用到的数据表和数据,需要录入 MySQL 中,我们建立并使用 test 的数据库。

create table news (
	id int(11) primary key auto_increment,
	title varchar(100) not null,
	content text)
;

insert into news (title,content)  values ('PHP 是最好的语言', '编程语言学习心得'), ('PHP 从入门到架构', 'ppt架构师了解一下');

2、coreseek 配置文件准备

将最小测试配置文件复制到 /usr/local/coreseek/etc/ 目录下命名为 csft.conf 文件 (文件名可以根据需要另行指定,/usr/local/coreseek/etc/csft.conf 是 coreseek 需要配置文件的默认路径和文件名,因此后面在启动 searchd 服务或者索引服务的时候可以省略配置文件路径)

3、建立索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf

测试索引

/usr/local/coreseek/bin/search php

看到如下输出,则索引建立好了。

在这里插入图片描述

4、启动 searchd 索引服务

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf # 如果是标准路径则配置文件路径可以省略

启动之后,我们就可以使用 php 来执行查询了

<?php
$s = new SphinxClient;
var_dump($s);
$s->setServer('127.0.0.1', 9312);
$s->setMatchMode( SPH_MATCH_EXTENDED2 );
$s->SetLimits( 0, 20, 1000 );
$result = $s->query( " PHP", 'ind_main' );
// $result2 = $s->query( " @(title, content) PHP", 'ind_main' ); // 指定搜索字段范围: 在 title, content 字段同时搜索 更多参见: http://web.archive.org/web/20150403083256/http://www.coreseek.cn:80/docs/coreseek_4.1-sphinx_2.0.1-beta.html
// $result3 = $s->query("架构师", 'ind_main');
var_dump($result);
// var_dump($result2);
// var_dump($result3);

补充:

上面注释掉的部分并没有得到期待的查询结果,这是 coreseek 的默认词库限制导致的,通常如果对搜索结果的精度有一定得要求,则会选择扩展词库,可以参见我的另一篇文章

更新索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --rotate --all # 当有多个索引的时候可以通过 --all 更新所有,也可以像这样(ind_main)指定更新单独的索引

结束语

最后我们来回顾一下,coreseek 是一款全文检索殷勤,作用是提供海量数据的高速检索和服务搭建配置等基础操作。

常见错误:

1、

error: cannot find input file: src/Makefile.in

或者遇到其他类似error错误时…

解决方案:

依次执行下面的命令,我运行’aclocal’时又出现了错误,解决方案请看下文描述

yum -y install libtool

aclocal

libtoolize --force

automake --add-missing

autoconf

autoheader

make clean

2、

如果出现undefined reference to `libiconv’的类似错误,可以按照如下方法处理:
首先configure,然后vim src/makefile
在其中搜索lexpat,在其后加上 -liconv
修改后该行应该为:-lexpat -liconv -L/usr/local/lib
然后再次make && make install

3、

编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in这个的错误,然后运行下列指令再次编译就能通过了:

aclocal

libtoolize --force

automake --add-missing

autoconf

autoheader

make clean

参考:
https://hackoops.com/480.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡德咏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值