首页 > 编程知识 正文

javaweb搜索功能实现(php搜索引擎代码)

时间:2023-05-03 06:23:12 阅读:69040 作者:4947

1 .为什么要使用Sphinx

如果您目前正在运营论坛,论坛数据超过100瓦,许多用户反映论坛搜索速度非常慢,请考虑使用Sphinx (当然,也可以使用其他全文搜索程序或方法)

2 .什么是2.Sphinx

Sphinx是由俄罗斯人Andrew Aksyonoff开发的高性能全文软件包,在通用和商务合同双重许可协议下发行。

全文检索是指以文件的所有文本信息为检索对象的信息检索技术。 检索的对象可能是文章的标题,也可能是文章的作者,也可能是文章的摘要和内容。

3.Sphinx特性

l高速索引(对于新CPU,约为10 MB/秒);

l高速检索(2-4G文本量中平均查询速度小于0.1秒);

l高可用性(在单CPU最具挑战性的秋季支持100 GB文本和100M文档);

l提供良好的相关排名

l分布式搜索支持

提供l文档的摘要生成

提供从MySQL内部插件存储引擎的搜索

l支持大胆的朋友、短语和同义词搜索

每个l文档支持多个全文域(默认最多32个);

每个l文档的多属性支持;

支持l断词

l支持单字节编码和UTF-8编码;

下载并安装Sphinx

网址http://www.coreseek.cn/news/7/52 /找到适合自己的操作系统版本。 例如,如果我是Windows,我就可以下载通用版本的Coreseek Win32。 在Linux上,可以下载并自行编译安装软件包。 这里解释一下为什么我们下载的程序叫做Coreseek。 Coreseek是基于Sphinx开发的软件,对Sphinx进行了一些更改,在中文方面比Sphinx更好,所以我们使用它。

下载完成后,将程序解压缩到您想要解压缩的位置。 例如,我想解压缩到电子驱动器的根目录。 然后,将目录重命名为Coreseek,Coreseek安装完成。 您安装的目录是E:coreseek。

使用Sphinx

要使用Sphinx,必须

1 )首先需要数据

2 )创建Sphinx配置文件

3 )生成索引

4 )启动Sphinx

5 )使用(调用api或search.exe程序进行咨询) )。

第1件()数据导入) )

创建测试所需的数据库、表和数据篇幅有限。 这些在附件里。 下载后导入到MySQL即可。

第二个:(创建配置文件() ) )

接下来,必须创建Sphinx配置文件E:coreseeketcmysql.conf,并按如下方式修改其内容:

source mysql

{

type=mysql

sql_host=localhost

sql_user=root

sql_pass=

sql_db=test

sql_port=3306

sql_query_pre=SET NAMES utf8

sql_query=SELECT id,addtime,title,content FROM post

sql_attr_timestamp=addtime

}

索引MySQL

{

source=mysql

path=e :/coreseek/var/data/MySQL

charset _ dict path=e :/coreseek/etc /

charset_type=zh_cn.utf-8

}

搜索

{

listen=931

2

max_matches                         = 1000

pid_file                                     = E:/coreseek/var/log/searchd_mysql.pid

log                                            = E:/coreseek/var/log/searchd_mysql.log

query_log                                = E:/coreseek/var/log/query_mysql.log

}

先讲下这个配置文件中每项的含义。

source mysql{} 定义源名称为mysql,也可以叫其他的,比如:source xxx{}

type  数据源类型

sql_* 数据相关的配置,比如sql_host,sql_pass什么的,这些不解释鸟

sql_query 建立索引时的查询命令,在这里尽可能不使用where或group by,将where与groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高,注意:select 的字段必须包括一个唯一主键以及要全文检索的字段,where中要用到的字段也要select出来

sql_query_pre 在执行sql_query前执行的sql命令, 可以有多条

sql_attr 以这个开头的配置项,表示属性字段,在where,orderby,groupby中出现的字段要分别定义一个属性,定义不同类型的字段要用不同的属性名,比如上面的sql_attr_timestamp就是时间戳类型。

index mysql{} 定义索引名称为mysql,也可以叫其他的,比如:index xxx{}

source 关联源,就是source xxx定义的。

path 索引文件存放路径,比如:E:/coreseek/var/data/mysql 实际存放在E:/coreseek/var/data/目录,然后创建多个名称为mysql后缀却不同的索引文件

charset_dictpath  指明分词法读取词典文件的位置,当启用分词法时,为必填项。在使用LibMMSeg作为分词 库时,需要确保词典文件uni.lib在指定的目录下

charset_type 字符集,比如charset_type = zh_cn.gbk

searchd{} sphinx守护进程配置

listen 监听端口

max_matches最大匹配数,也就是查找的数据再多也只返回这里设置的1000条

pid_file pid文件路径

log全文检索日志

query_log查询日志

好了,配置文件就这样,配置的参数还有很多,大家可以自己查文档。

第3件:(生成索引)

开始 -> 运行 -> 输入cmd回车,打开命令行工具

e:coreseekbinindexer --config e:coreseeketcmysql.conf --all

这一串东西其实就是调用indexer程序来生成所有索引

如果只想对某个数据源进行索引,则可以这样:e:coreseekbinindexer --config e:coreseeketcmysql.conf 索引名称(索引名称指配置文件中所定义的)

--config,--all这些都是indexer程序的参数,想了解更多参数的朋友可以查看文档

运行命令后如果你没看到FATAL,ERROR这些东西,那么索引文件就算生成成功了,比如我看到得就是

………省略………

using config file 'e:coreseeketcmysql.conf'...

indexing index 'mysql'...

collected 4 docs, 0.0 MB

………省略………

第4件:(启动Sphinx)

同样命令行下

e:coreseekbinsearchd --config e:coreseeketcmysql.conf

运行后提示了一大堆东西

using config file 'e:coreseeketcmysql.conf'...

listening on all interfaces, port=9312

accepting connections

不用管这些鸟文是啥意思,反正Sphinx是启动好了。

现在有一串鸟文的这个命令行是不能关的,因为关了Sphinx也就关了,如果觉得这样不爽,可以将Sphinx安装成系统服务,在后台运行。

安装系统服务只需在命令行中输入以下命令

e:coreseekbinsearchd --config e:coreseeketcmysql.conf --install

安装之后记得启动这个服务,不会启动那我没法,自己google。

第5步:(使用Sphinx)

在web根目录下建立一个search目录(当然不在根目录也行,同样目录名也可以随取),复制E:coreseekapi sphinxapi.php文件到search目录(sphinxapi.php这个是sphinx官方提供的api),开始php程序的编写。

在search目录建立一个文件,名字叫啥都行,我管它叫index.php,其内容如下

include 'sphinxapi.php';  // 加载Sphinx API

$sc = new SphinxClient(); // 实例化Api

$sc->setServer('localhost', 9312); // 设置服务端,第一个参数sphinx服务器地址,第二个sphinx监听端口

$res = $sc->query('sphinx', 'mysql'); // 执行查询,第一个参数查询的关键字,第二个查询的索引名称,mysql索引名称(这个也是在配置文件中定义的),多个索引名称以,分开,也可以用*表示所有索引。

print_r($res);

打印结果:

Array

(

………省略………

[matches] => Array

(

[2] => Array

(

[weight] => 2

[attrs] => Array

(

[addtime] => 1282622004

)

)

[4] => Array

(

[weight] => 2

[attrs] => Array

(

[addtime] => 1282622079

)

)

)

………省略………

)

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

查询结果中键值分别表示

2唯一主键

weight权重

attrs sql_attr_*中配置

至此,搜索引擎算是完成一大半了,剩下的大家可以自行完成。

比如:

$ids    = array_keys($res['matches']); // 获取主键

$ids = join(',', $ids);

$query  = mysql_query("SELECT * FROM post WHERE id IN ({$ids})");

while($row = mysql_fetch_assoc($query)) {

.....

}

Sphinx的更多配置,程序的参数等,大家可以查看Sphinx的文档。

jqdkfd有事情忙的时候,你会觉得时间过得很快 很快。可能你会感觉有点累。但这是一个人成功的历程。请坚信,我一定会好好的。

更多

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。