Sphinx实验手册.docx

上传人:b****8 文档编号:9887727 上传时间:2023-02-07 格式:DOCX 页数:22 大小:361.80KB
下载 相关 举报
Sphinx实验手册.docx_第1页
第1页 / 共22页
Sphinx实验手册.docx_第2页
第2页 / 共22页
Sphinx实验手册.docx_第3页
第3页 / 共22页
Sphinx实验手册.docx_第4页
第4页 / 共22页
Sphinx实验手册.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

Sphinx实验手册.docx

《Sphinx实验手册.docx》由会员分享,可在线阅读,更多相关《Sphinx实验手册.docx(22页珍藏版)》请在冰豆网上搜索。

Sphinx实验手册.docx

Sphinx实验手册

Sphinx实验手册

Sphinx+linux+apache+mysql+php+coreseek

环境准备:

源代码编译的LAMP环境

Centos5.5Linux版本

Mysql-5.1mysql版本

Apache-2.2.9apache版本

Php-5.2.6php版本

Sphinx安装与运行测试

(1)、下载Sphinx

从sphinx官网上找到sphinx的安装源码,我们下的是0.9.9-release版。

下载地址:

如果你的linux能联网的话,用wget命令直接下载.

Wget

解压:

tar-zxvfsphinx-0.9.9.tar.gz

(2)、编译安装

进入到sphinx的源码文件夹里,运行下列命令就可以安装sphinx了:

cd/lamp/sphinx-0.9.9

./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql

make && make install

Sphinx中重要的三个命令,(Sphinx安装的bin目录下)

Indexer创建索引命令。

Searchd启动进程命令。

Search命令行搜索命令。

(3)、准备mysql数据

我们需要一些数据,这里我们用安装mysql自带的test库进行测试

准备一个post贴子表,其中该表的字段如下:

Createtablepost(

Idintunsignedauto_incrementprimarykey,

Titlevarchar(200),

Contenttext);

(4)、进入mysql中查看并添加的数据

/usr/local/mysql/bin/mysql-uroot–p123test

向post贴子表中导入数据:

mysql>insertintopost(title,content)values('兄弟连','感谢LAMP兄弟连的广大会员,感谢一直以来对兄弟连的关注与支持');

(5)、配置sphinx.conf配置文件。

进入到sphinx的etc目录找到配置文件

cd /usr/local/sphinx/etc

我们需要备份一下配置文件,防止改错不好处理。

cp sphinx.conf.dist sphinx.conf

进入配置文件

vim sphinx.conf

配置文件的格式:

#################################################################

主数据源:

sourcemain{

}

增量数据源:

sourcedelta:

main{

}

主数据索引:

indexmain{

}

增量数据索引:

indexdelta:

main{

}

分布式索引:

indexdist1{

}

索引器:

indexer{

}

服务进程:

searchd{

}

#################################################################

sphinx.conf的基本配置:

数据源src是名字可以自己指定,即主数据源

sourcesrc1

{

type=mysql#数据库类型

sql_host=localhost#MySQL主机IP

sql_user=root#MySQL用户名

sql_pass=123#MySQL密码

sql_db=test#MySQL数据库

sql_port=3306#MySQL端口

sql_sock=/tmp/mysql.sock#如果是linux下需要开启,指定sock文件

sql_query_pre=SETNAMESUTF8#MySQL检索编码

sql_query_pre=SETSESSIONquery_cache_type=OFF#关闭缓存

sql_query=\#获取数据的SQL语句

SELECTid,title,contentFROMpost

#sql_attr_uint=group_id#对排序字段进行注释

#sql_attr_timestamp=date_added#对排序字段进行注释

sql_query_info=SELECT*FROMpostWHEREid=$id

}#这行不需要修改

sourcesrclthrottled:

srcl#继承主数据源

主数据源索引:

indextext1

source=src1#索引源声明

charset_type=utf-8#数据编码(设置成utf8)

charset_table=#上面指定了utf-8,这里需要开启

}

增量索引

indextestlstemmed:

test1#先进行注释

indexdistl#分布式也注释掉

索引器设置

indexer

{

mem_limit=256M#内存大小限制默认是32M,推荐为256M

}#其他用默认即可

sphinx服务进程searchd的相关配置

searchd{

}#全部用默认的就可以了

如果是本地测试,使用默认就可以,如果是多个服务器测试需要指定监听的ip即可

#Sphinx配置文件结束

(6)、创建索引

Sphinx的配置文件配置完成,数据也导进去了,接下来就用下面命令来创建索引:

创建索引命令:

indexer

-c指定配置文件

--all对所有索引重新编制索引

--rotate用于轮换索引,主要是再不停止服务的时候,增加索引

--merge合并索引

/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx.conf--all

创建索引是报了一个这样的错误:

/usr/local/sphinx/bin/indexer:

errorwhileloadingsharedlibraries:

libmysqlclient.so.16:

cannotopensharedobjectfile:

Nosuchfileordirectory

可以用下面方法解决:

locate libmysqlclient    运行该命令找到关于libmysqlclient.so.16的文件

然后把该文件的一个连接复制到在环境变量的文件夹/usr/lib/下

cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16

再次运行创建索引命令就能完成索引的创建了

出现这样的提示就表示创建成功

(7)、测试

检查数据命令:

search

/usr/local/sphinx/bin/search-c/usr/local/sphinx/etc/sphinx.conftest

可以看到将数据中含有test关键字的数据查询出来,包括文档id,权重,属性值等

我们搜索下中文看下。

/usr/local/sphinx/bin/search-c/usr/local/sphinx/etc/sphinx.conf'兄弟连'

找不到数据,为什么?

Coreseek-带有中文分词的Sphinx

Coreseek介绍:

Sphinx默认不支持中文索引及检索,基于Sphinx开发了Coreseek全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词

(1)、下载中文分词包

到官网去下载Coreseek相应的版本

(2)、解压安装

cd/lamp

tar -zxvf coreseek-3.2.14.tar.gz

进入到mmseg所在文件夹,先安装中文分词mmseg

cd/lamp/coreseek-3.2.14/mmseg-3.2.14/

./configure --prefix=/usr/local/mmseg

编译过程中报了一个config.status:

error:

cannotfindinputfile:

src/Makefile.in

这个的错误,然后运行下列指令再次编译就能通过了:

automake

然后再进行编译和安装:

make && make install

然后运行mmseg,就能输入安装成功的信息了:

/usr/local/mmseg/bin/mmseg 

出现下列信息,就证明mmseg中文分词已经安装好了。

接下来,我们要把Sphinx和mmseg结合起来

(1)、检测安装

进入coreseek目录,进行安装

cd /lamp/coreseek-3.2.14/csft-3.2.14/

./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/

make&&makeinstall

(2)、配置带有中文分词的sphinx配置文件

配置文件和上面的步骤一样,只不过是在coreseek中,有几个地方需要注意。

注意:

coreseek中得配置文件也是csft.conf,而不是sphinx.conf

cd/usr/local/coreseek/etc

cpsphinx.conf.distcsft.conf

vimcsft.conf

其他地方都一样,对照下面不一样的地方修改

indextest1

{

#stopwords=G:

\data\stopwords.txt

#wordforms=G:

\data\wordforms.txt

#exceptions=/data/exceptions.txt

#charset_type=sbcs

添加下面这两行,意思是把中文分词加入到配置文件中

charset_type=zh_cn.utf-8

charset_dictpath=/usr/local/mmseg/etc/#你安装mmseg的目录

}

(3)、生成索引并测试

创建索引

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

再次测试搜索中文

/usr/local/coreseek/bin/search[-a]-c/usr/local/coreseek/etc/csft.conf'兄弟连'

注意:

如果你设置的coreseek配置文件为csft.conf,则inder、search和searchd时不用带上-c/usr/local/coreseek/etc/csft.conf,因为默认就是去寻找这个文件.

我们在linux下Sphinx,中文分词已经安装完成了,并测试成功

如何用PHP去使用Sphinx技术

在这篇中我们使用php程序操作Sphinx做个小的站内搜素引擎

Sphinx集成到PHP程序中,有两种方式:

1.Sphinxphp模块

2.Sphinxapi类

我们要使用Sphinx需要做以下几件事:

1、首先得有数据

2、建立Sphinx配置文件

3、生成索引

4、启动Searchd服务进程,并开户端口9312

5、用PHP客户程序去连接Sphinx服务

一、启用sphinx服务

想要在程序中使用Sphinx必须开启Sphinx服务

启动进程命令:

searchd

-c#指定配置文件

--stop#是停止服务

--pidfile#用来显式指定一个PID文件

-p#指定端口

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

注意:

这里启动的服务是searchd,不是search

Sphinx默认的端口是9312端口

如果出现这个问题:

说明端口已经被占用了,解决的办法是:

netstat--tunpl|grep9312找出进程ID,

kill-9进程id,再开启就可以了

二、用PHP连接使用Sphinx程序

(1)全PHP加载Sphinx模块

wget 

tarzxfsphinx-1.1.0.tgz

cd/www/soft/sphinx-1.1.0

/usr/local/webserver/php/bin/phpize

./configure--with-php-config=/usr/local/webserver/php/bin/php-config

提示出错:

checkingforlibsphinxclientheadersindefaultpath...notfound

configure:

error:

Cannotfindlibsphinxclientheaders

找了下libsphinxclient,在/www/soft/csft-3.2.13/api/libsphinxclient,之前安装的是coreseek3.2.13版

cdlibsphinxclient/

./configure

make&&makeinstall

安装完libsphinxclient,继续安装sphinx扩展

cd/www/soft/sphinx-1.1.0

/usr/local/php/bin/phpize

./configure--with-php-config=/usr/local/php/bin/php-config

make &&makeinstall

cd/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

看到sphinx.so

vi/usr/local/webserver/php/etc/php.ini 

加入extension=sphinx.so

/usr/local/apache2/bin/apachectlrestart

测试Sphinx模块,http:

//192.168.10.1/phpinfo.php

(2)、使用API类连接Sphinx程序

需要到coreseek解压包中找到sphinxapi.php文件,放到程序目录下

cp/lamp/coreseek-3.2.14/csft-3.2.14/api/sphinxapi.php/usr/local/apache2/htdocs/

include'sphinxapi.php';

//加载SphinxAPI

$sphinx=newSphinxClient();

#创建sphinx对象

$sphinx->SetServer("localhost",9312);

#建立连接,第一个参数sphinx服务器地址,第二个sphinx监听端口

$result=$sphinx->query($keyword,"*");

#执行查询,第一个参数查询的关键字,第二个查询的索引名称,多个索引名称用,分开,也可以用*表示全部索引,其中包括增量索引

print_r($result);

#打印结果

找到下面这一段,是我匹配的数据

[matches]=>Array(//匹配的结果

[6]=>Array

[weight]=>4

[attrs]=>Array

[group_id]=>1

[date_added]=>1319127367

#一个多维的数组,下标[6]是你匹配包含关键字的文档id,id对应的数组,[weight]是权重,[attrs]是属性,我们在配置文件中指定的

这段也是我们需要的数据

[total]=>2

#此查询在服务器检索所得的匹配文档总数

[total_found]=>2

#索引中匹配文档的总数

[time]=>0.009

#这个是我们这次查询所用的时间

[words]=>Array(

[兄弟]=>Array

[docs]=>2在文档中出现多少次(content字段中)

[hits]=>6一共出现多少次

[连]=>Array

[docs]=>2

[hits]=>6

(3)、取得数据摘要并高亮显示

Matches中就是我们匹配的结果,但是仿佛不是我们想要的数据,比如titile,content字段的内容就没有匹配出来,根据官方的说明是Sphinx并没有连接到MySQL去取数据,只是根据它自己的索引内容进行计算,因此如果想用Sphinx提供的API去取得我们想要的数据,还必须以查询的结果为依据,再次查询MySQL从而得到我们想要的数据

比如:

$mysqli=newmysqli("localhost","root","password","test");

$ids=join(',',array_keys($result['matches']));要把需要的id取出来。

$sql="selecttitle,contentfrompostwhereidin({$ids})”;

$result=$mysqli->query($sql);

while($row=$result->fetch_row()){

#循环体开始解析看下结果.

下面我们在输出结果的时候需要生成摘要,高亮(就是和XX一样,关键字飘红)我们需要用到buildExcerpts这个函数,(php手册中)语法格式:

publicarraySphinxClient:

:

buildExcerpts(array$docs,string$index,string

$words[,array$opts])

#返回的是一个数组,一共有四个参数

#第一个参数是从数据库中查询的结果集

#第二个参数是索引的名字

#第三个参数是要高亮显示的关键字

#第四个参数是显示的字格式化

$opts=array(

#格式化摘要,高亮字体设置

#在匹配关键字之前插入的字符串,默认是

"before_match"=>"

bold;color:

red'>",

#在匹配关键字之后插入的字符串,默认是

"after_match"=>"",

#在摘要段落之前插入的字符串默认„

"chunk_separator"=>"...",

);

$res=$sphinx->buildExcerpts($row,"index",$keyword,$opts);

echo"".$res[0]."
";标题

echo"".$res[1]."
";摘要

echo$res[2]."

";添加时间

}

#循环体结束

到这里呢,我们用php程序调用sphinxapi实现了高亮摘要功能

三、匹配模式

匹配模式:

SetMatchMode(设置匹配模式)

原型:

functionSetMatchMode($mode)

SPH_MATCH_ALL匹配所有查询词(默认模式).

SPH_MATCH_ANY匹配查询词中的任意一个.

SPH_MATCH_PHRASE将整个查询看作一个词组,要求按顺序完整匹配.

SPH_MATCH_BOOLEAN将查询看作一个布尔表达式.

SPH_MATCH_EXTENDED将查询看作一个Sphinx内部查询语言的表达式.

SPH_MATCH_FULLSCAN使用完全扫描,忽略查询词汇.

SPH_MATCH_EXTENDED2类似SPH_MATCH_EXTENDED,并支持评分和权重

四、Sphinx实时索引

数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引。

1、创建一个计数器

一个简单的实现是,在数据库中增加一个计数表,记录将文档集分为两个部分的文档ID,每次重新构建主索引时,更新这个表

先在mysql中插入一个计数表

CREATETABLEsph_counter(counter_idINTEGERPRIMARYKEYNOTNULL,max_doc_idINTEGERNOTNULL);

2、再次修改配置文件

主数据源,继承数据源,主索引,继承索引。

(继承索引也就是增量索引)。

主数据源里面:

我们需要把欲查询语句改成下面的语句:

Vi/usr/local/coreseek/etc/csft.conf

Sourcemain{

把sql_query_pre的改成下面的语句

sql_query_pre=REPLACEINTOsph_counterSELECT1,MAX(id)FROMpost

sql_query=\

SELECTid,title,contentFROMpost\

WHEREid<=(SELECTmax_doc_idFROMsph_counterWHEREcounter_id=1)

}

继承数据源:

sourcedelta:

main

{

sql_query_pre=SETNAMESutf8

sql_query

=\

SELECTid,title,contentFROMpost\

WHEREid>(SELECTmax_doc_idFROMsph_counterWHEREcounter_id=1)

}

主索引:

把名字该成想对应的

Indexmain{

source=main

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1