在本文中我将给大家带来Coreseek(Sphinx)在PHP中的一个简单的例子、并在后面给大家讲一下Coreseek(Sphinx)在LAMP环境中的一些注意事项,比如searchd的开机启动呀,Sphinx实时索引啊。
有关coreseek(sphinx)在LAMP上的安装以及配置、使用大家请参考我之前的两篇博客:
CentOS 7下安装Coreseek中文检索引擎
LAMP+Coreseek中文检索引擎使用详解
PS:这里用到的数据库和数据表都是在前面两篇博客中创建的。
一、coreseek+mysql+php 的一个简单使用:模拟搜索引擎
1、创建搜索首页:index.php
<html>
<head>
<title>测试搜索
</title>
</head>
<body>
<h1>简单PHP搜索引擎
</h1>
<form action='find.php' method='post'>
请输入搜索关键字:
<input type='text' name='find'><br>
<input type='submit' value='提交搜索关键字'>
</form>
</body>
</html>
效果:
2、处理并显示搜索结果页面:find.php
<html>
<head><title>Result
</title></head>
<body>
<h1>搜索结果展示
</h1>
<?php
$keyword = $_POST['find'];
$sphinx = new SphinxClient();
//设置主机和端口号
$sphinx->SetServer("localhost",9312);
//搜索匹配方案
$sphinx->SetMatchMode(SPH_MATCH_ANY);
//query('a','b');在b索引中搜索关键字a,*表示所有索引
$result = $sphinx -> query("$keyword","*");
$ids = join(',',array_keys($result['matches']));
$mysql = new mysqli('localhost','root','zhongjin','test');
$mysql->query("SET NAMES utf8");
$sql = "SELECT * FROM documents WHERE id IN({$ids})";
$res = $mysql->query($sql);
$count = $res->num_rows;
//该数组设置搜索关键字的显式样式
/*
$opts = array(
'before_match' => "<font>",
'after_match' => "</font>",
);
*/
$opts = array(
'before_match' => "<button>",
'after_match' => "</button>",
);
if($count > 0){
while($ret = $res->fetch_assoc()){
//使搜索关键字高亮显示
$row = $sphinx -> buildExcerpts($ret,'main',$keyword,$opts);
echo "标题:{$row[4]}<br>";
echo "内容:{$row[5]}";
echo "<hr>";
}
echo "搜索结果{$count}条。";
}else{
echo "无搜索结果!";
}
?>
</body>
</html>
当我搜索 ’LSGO实验室‘ 时,效果如下:
这就是sphinx+MySQL+php的一个简单应用,以及使搜索关键字高亮显示。
二、sphinx的实时索引
1、为什么要实现sphinx实时索引?
看看 coreseek 增量索引模拟实时索引 ,在这里就引用该篇文章的内容:
有这么一种常见的情况:整个数据集非常大,以至于难于经常性的重建索引,但是每次新增的记录却相当地少。一个典型的例子是:一个论坛有1000000个已经归档的帖子,但每天只有1000个新帖子。
在这种情况下可以用所谓的“主索引+增量索引”(main+delta)模式来实现“近实时”的索引更新。