Sphinx和coreseek检索引擎

时间:2023-03-09 08:25:42
Sphinx和coreseek检索引擎

Sphinx是检索英文用,coreseek是检索中文用。

Sphinx(斯芬克斯)是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

Like ‘%%’ sql    中国  xxx

Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

Sphinx的主要特性包括:

高速索引 (在新款CPU上,近10 MB/秒); 高速搜索 (2-4G的文本量中平均查询速度不到0.1秒); 高可用性 (单CPU上最大可支持100 GB的文本,100M文档); 提供良好的相关性排名 支持分布式搜索; 提供文档摘要生成; 提供从MySQL内部的插件式存储引擎上搜索 支持布尔,短语, 和近义词查询; 支持每个文档多个全文检索域(默认最大32个); 支持每个文档多属性; 支持断词; 支持单字节编码与UTF-8编码;

coreseek是一款基于sphinx开源的搜索引擎,专门为用户提供免费的中文全文检索系统,coreseek被称为带有中文分词的sphinx,与sphinx不同的是coreseek增加了一个带有中文分司的词库,这里使用了coreseek 3.2.14版本进行解讲,本篇讲解如何安装coreseek,并同时解决如何给php加上sphinx模块。首先在系统安装好lnmp环境即linux+mysql+php+nginx环境,如果不知道如何安装请看我之前见的关于lnmp环境安装文章。

http://219.232.239.243/uploads/csft/4.0/coreseek-4.1-win32.zip

从这里开始——

什么时候使用?

在MYSQL中当对一个文本类型字段进行Like并以%开头的查询时,会进行全表扫描。

模糊查询:

1.全文扫描太慢了

2.MySQL没有分词

Sphinx就可以解决以上两个问题。

总结:当一个功能对表中的text、varchar等文本类型的字段进行LIKE查询时,MySQL是全表扫描非常慢,需要使用sphinx。

我们商城中的 根据关键字搜索的功能需要Sphinx优化:1,可以解决性能的问题;2,可以解决分词的问题。

优化网站:搜索引擎用Sphinx、全站静态化

怎么使用Sphinx?

Sphinx有两种使用方式:

1.原始用法:Sphinx和MYSQL是两个独立的服务器

PHP把要搜索的短语发给sphinx服务器,sphinx返回的是记录的ID

PHP在使用sphinx返回的ID查询数据库

Sphinx和coreseek检索引擎

2.把sphinx集成到MYSQL里面去(没有单独的sphinx服务器)

PHP只需要写一个SQL语句即可,不用管sphinx,MYSQL会自己连接查询。

如果使用这种,需要在LINUX下重新编译MYSQL,把sphinx当成插件编译到MYSQL中去。

Sphinx和coreseek检索引擎

实际操作:

1.先下载sphinx包,我们下载的是coreseek。Coreseek是加了中文包的sphinx。

2.下载包后,几个重要的说明

etc中的csft_mysql.conf文件是数据库索引配置文件(后面会说如何配置参数):

Sphinx和coreseek检索引擎

注意:这个文件配置完成后需要放入bin文件夹下,并改名为sphinx.conf

Sphinx和coreseek检索引擎

indexer.exe文件是创建全文索引程序,一般都是通过命令行来创建(请看后面的创建数据源的索引);创建之前必须要把上面的csft_mysql.conf文件配置好。

一般情况下创建完索引后会在命令行先测试一下(请看后面的 bin\search -c bin\xx.conf +搜索词)。最后需要启动一下sphinx服务器( 请看后面的启动sphinx服务器),

Sphinx和coreseek检索引擎

这是sphinx的接口类库,需要把这个文件放入项目或框架中才能起到作用

Sphinx和coreseek检索引擎

实际应用:

先复制MYSQL的配置文件模板(即etc/csft_mysql.conf)到bin文件夹下并改名为sphinx.conf

SQL语句中 GROUP_CONCAT()  把多个值拼成一个字符串配置

既可以搜商品名称也可以搜商品属性的值,GROUP_CONCAT()把多个属性值拼成一个字符串。

一下两张图片是配置文件的信息:source + 名称   代表数据源,名称可以随便定义

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

注意:下面是杨写的,可做参考

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

创建数据源的索引:

在命令行窗口下执行 " bin\indexer -c bin\xxx.conf index即:创建名为index的数据源的索引。如果需要创建 xxx.conf 配置文件中的所有索引,刚使用 --all 替代index

搜索中文时,出现 iconv 不是内部或外部命令。解决办法:运行一下 "set PATH=%CD%\bin;%PATH%",即可解决;

这里面最后的那个sphinx代表bin/sphinx.conf文件

Sphinx和coreseek检索引擎

bin\search -c bin\xx.conf +搜索词    测试一下是否成功创建索引

Sphinx和coreseek检索引擎

设为开机启动:在控制面板——管理工具中——计划任务中设置

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

启动sphinx服务器

bin\searchd   -c   bin\sphinx.conf //开启搜索服务

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

注意:查看是否启动的方法是在:任务管理器->服务->右下角服务->找searchd,看是否已启动。

在coreseek/api目录下,有个名为 sphinxapi.php 的文件,这就是php api接口。

Sphinx和coreseek检索引擎

如何使用coreseek:使用之前必须要把sphinxapi.php这个接口文件放在项目中:

然后写下面的代码,设置coreseek参数

 <html>
<head>
<form action="test.php" method="post">
输入关键词:<input type=“test” name="keyword"
size="30" />
<input type="submit" name="sub" value="搜索" /> </form>
<?php
echo "<pre>";
require_once('sphinxapi.php');
if(isset($_POST['sub']) && $_POST['keyword'] != ''){
$keyword = trim($_POST['keyword']);
$sph = new SphinxClient();
$sph->SetServer('localhost',9312);
//连接9312端口
$sph->setMatchMode(SPH_MATCH_ANY);
//设置匹配方式
$sph->SetSortMode(SPH_SORT_RELEVANCE);
//查询结果根据相似度排序
$sph->SetArrayResult(true);
//设置结果返回格式,true以数组,false以phphash格式返回,默认为false $result = $sph->query($keyword,'sphinx');
//执行搜索操作,参数(关键词,索引名),返回结果是商品的id
print_r($result);
} ?> </head>
</html>

Sphinx自动生成索引

在使用sphinx生成索引时,只会为当前数据库中的数据生成索引。生成索引之后,如果在数据库中又添加了新的数据,那么在sphinx 是无法搜索到新的数据,需要把新的数据也生成索引并添加到sphinx 中去才行。

如果每次插入新的数据之后都要手动在重建索引繁琐了,所以我们一般要配置sphinx每隔一段时间自动把数据库中最新插入的数据重新生成新的索引文件,并把这个新的索引文件合并到主索引文件上。

实际操作:

1.每次生成索引文件之后,要把最后一条记录的ID保存下来,下次ID大于这个ID 的就是新数据。

可以通过建一张表来保存这个ID。

  配置sphinx让每次生成索引之后能够直接把最大的ID 更新进来。

Sphinx和coreseek检索引擎

2、定期为新添加的数据生成索引

修改sphinx定义一个新的数据源(新插入的还没有创建索引的数据)

Sphinx和coreseek检索引擎

新添加一个index索引(每个数据源对应一个index)

Sphinx和coreseek检索引擎

写一个bat脚本,让这个脚本定期的用新的数据源生成索引文件,并把这个索引文件合并到主索引文件(第一次生成的索引文件)上。

Sphinx和coreseek检索引擎

配置windows系统,让系统定期执行这个bat.脚本即可:双击这个文件即执行一遍更新一遍索引。

Sphinx和coreseek检索引擎

将文本转化为bat脚本

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

Sphinx和coreseek检索引擎

将sphinx引入 TP 框架

Sphinx和coreseek检索引擎