内容简介:在本文中我将给大家带来Coreseek(Sphinx)在PHP中的一个简单的例子、并在后面给大家讲一下Coreseek(Sphinx)在LAMP环境中的一些注意事项,比如searchd的开机启动呀,Sphinx实时索引啊。有关coreseek(sphinx)在LAMP上的安装以及配置、使用大家请参考我之前的两篇博客:PS:这里用到的数据库和数据表都是在前面两篇博客中创建的。
前言:
在本文中我将给大家带来Coreseek(Sphinx)在 PHP 中的一个简单的例子、并在后面给大家讲一下Coreseek(Sphinx)在LAMP环境中的一些注意事项,比如searchd的开机启动呀,Sphinx实时索引啊。
有关coreseek(sphinx)在LAMP上的安装以及配置、使用大家请参考我之前的两篇博客:
- CentOS 7下安装Coreseek中文检索引擎 http://www.linuxidc.com/Linux/2017-05/143599.htm
- LAMP+Coreseek中文检索引擎使用详解 http://www.linuxidc.com/Linux/2017-05/143600.htm
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>搜索结果展示www.linuxidc.com</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 style='font-weight:bold;color:#f00'>", 'after_match' => "</font>", ); */ $opts = array( 'before_match' => "<button style='font-weight:bold;color:#f00'>", '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 增量索引模拟实时索引 http://www.linuxidc.com/Linux/2017-05/143601.htm ,在这里就引用该篇文章的内容:
有这么一种常见的情况:整个数据集非常大,以至于难于经常性的重建索引,但是每次新增的记录却相当地少。一个典型的例子是:一个论坛有1000000个已经归档的帖子,但每天只有1000个新帖子。
在这种情况下可以用所谓的“主索引+增量索引”(main+delta)模式来实现“近实时”的索引更新。
这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主索引,而对新增文档建立增量索引。在上述例子中,那1000000个已经归档的帖子放在主索引中,而每天新增的1000个帖子则放在增量索引中。增量索引更新的频率可以非常快,而文档可以在出现几分种内就可以被检索到。
确定具体某一文档的分属那个索引的分类工作可以自动完成。一个可选的方案是,建立一个计数表,记录将文档集分成两部分的那个文档ID,而每次重新构建主索引时,这个表都会被更新。
这里再用我的理解跟大家陈述一遍(如果大家有看我的前面两篇博客,这里会看的非常明白):
在前面我有一张documents表,现在我要往里面添加一篇文章,我想使这篇文章被检索到,就要执行 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate
,要想减少能够检索的时间,我们可以使用crontab实现每分钟执行一次该命令。
然而这条命令是把整张表重新建立主数据索引,假如该表现在已经有好几千万条数据了,如果把整张表的数据重新建立索引,就会大量的消耗服务器CPU和内存。
上面说的解决方案就是,我能不能仅仅对今天新增的数据建立索引,主数据索引保持不变?毕竟一天内新增的数据不会太多。
这里实现的办法就是“主索引+增量索引”,原来的数据保存在主索引里面,而新增的数据就保存在增量索引里面,在服务器空闲的时候(一般在凌晨),在将增量索引并到主索引中去,这样就不会影响到第二天的建立增量索引。
2、建立计数表
该表的作用是记录将文档集分成两部分的那个文档ID(一部分保存在主数据索引,一部分保存在增量索引),其实就是昨晚将增量索引并入主数据索引时 documents 数据表的 id 的最大值,而每次重新构建主索引时,这个表都会被更新。
创建计数表:
mysql -uroot -pzhongjin test; CREATE TABLE sph_counter( counter_id INT PRIMARY KEY NOT NULL, max_doc_id INT NOT NULL );
3、修改配置文件csft.conf
在修改配置文件之前,给大家说一下 mysql 中的 REPLACE INTO 的用法:
使用 REPLACE INTO 的时候会带上一个主键,假如目标数据表中对应的该主键没有数据,那么 REPLACE INTO 就会往里面插数据(相当于 INSERT INTO)。假如该主键已经有数据了,REPLACE INTO就会更新该条数据。
修改配置文件 csft.conf:
#1、在主数据源中(source main{})修改: #新增一行,作用是更新sph_counter表 sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM documents; #2、将增量数据源(source src1throttled : src1{})的注释打开 #修改增量数据源名字并添加如下内容: source delta : main{ sql_ranged_throttle = 100 sql_query_pre = SET NAMES UTF8 sql_query = \ SELECT id,group_id,UNIX_TIMESTAMP(date_added) AS date_added,title,content FROM \ documents WHERE id > (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1) } 3、将增量数据索引(index test1stemmed : test1){})的注释打开 #修改增量数据索引名字并添加如下内容: index delta : main { source = delta path = /usr/local/coreseek/var/data/delta morphology = stem_en }
注意:增量数据源的 sql 语句搜索出来的结果字段一定要与主数据源的对称,因为他俩是继承关系,如果不对称,就会报错:字段不统一
更多详情见请继续阅读下一页的精彩内容 : http://www.linuxidc.com/Linux/2017-05/143603p2.htm
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。