注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

php 王建

php之路

 
 
 

日志

 
 

linux sphinx全文搜索  

2012-07-03 21:40:27|  分类: linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这几天一直在搭建sphinx,碰到了各种各样的问题,终于完成了。随便写写,因为数据库的数据量很大,又加上搜索,不可能用like进行模糊的匹配,所以就想到了用sphinx,因为服务器是linux 再加上我搜索的表里面没有汉字,暂时也没有用到中文分词,就是实现了简单的全文搜索,但是还有一点要注意的就是,生成索引的时候数据大不可能全部进行生成,所以就实现了主索引加上增量索引。(他的基本原理就是首先查询数据库中的最大的id  插入到另外的一张表内)在配置文件内有一个sql_query_pre

我的配置是这样的sql_query_pre = REPLACE INTO oem_counter SELECT 1, MAX(oem_id) FROM oem_products  //这句话的意思就是从oem_products 表内把最大的id查询出来然后插入到oem_counter内

sql_query                               = \
                SELECT oem_id,oem_p_id,UNIX_TIMESTAMP(oem_addtime) AS date_added, oem_partno \
                FROM oem_products where oem_id <=(SELECT max_doc_id FROM oem_counter WHERE counter_id=1)

这句话的意思很明显就是查询id小于最大的max_doc_id

 我的配置主要有这样的

source oem{

}这个主要是源

source delta : oem{

}//这个是增量索引的源

index oem{

//这个里面有几点要注意的就是,我先说下我的问题。刚开始我要实现的就是比如我要搜索 wangjian这个字符串 我们要的其实就是 adaddwangjian  wangjianasdasdas 这样的都可以进行搜索出来。所以最后我详细的参考了官方的文档有一个中缀索引和前缀索引

我设置的是中缀索引min_infix_len          =1 这个可以参考下官方的文档

}//索引

index delta : oem{

}//这个是增量索引

----------------------------------------------------

按照上面的格式我们可以设置多个源和索引(搜索多张表)

这个配置完成之后我们就可以进行服务启动,

1:首先要进行重新建索引,我电脑上的sphinx是安装在/usr/local/sphinx/下面

下面就用这种办法进行索引/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate(--all就是重建所有的,但是如果你有很多的但是你要重建某个你可以指定名字)

2:命令行下的搜索/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.conf wanjian

3:如何在php页面进行调用,要开启searchd进程

/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf

然后查看下是否开启了

linux sphinx全文搜索 - 一根烟的寂寞 - php 王建

 

我的已经启动了。下面就是在php里面进行调用了

include_once 'sphinxapi.php';
$sphinx = new SphinxClient();
$server = '192.168.1.2';
$port = 9312;
$indexName = 'oem';
$sphinx = new SphinxClient();
$sphinx->SetServer($server, $port);
$sphinx->SetMatchMode(SPH_MATCH_all);
$sphinx->SetConnectTimeout(10);
$sphinx->SetMaxQueryTime(2000);
//$sphinx->SetLimits(0,2);//此处是为了设置分页,limit和数据库的limit方法用法是一样的参考sphinx的帮助手册


$k = $_GET['key'];
$orgDatas = $sphinx->Query($k, $indexName);
echo "<hr>";
echo '<h1>查询出的个数是:'.$orgDatas['total_found']."</h1>";
$errors = $sphinx->GetLastError();
echo "<pre>";

//print_r($errors);
print_r($orgDatas);

echo "</pre>";

有时候查询出的关键词我们要进行描红,

 function hightred($key,$str){
 $res = str_ireplace($key,"<b style=\"text-decoration:underline;color:#dd4b39;font-weight:lighter\">$key</b>",$str);
 return $res;
}

网上这样的代码很多,可以参考

 

其实上面还不算完,我们每天要更新索引,所以要写个计划任务,具体的情况根据你的服务器看提供什么服务,什么时候执行脚本等。

我写的是每天执行脚本 主要是更新 增量索引。

后期还有分词的功能,因为暂时项目也没用到,暂时先不写了。。

----------------------------------------------------------------------------

ok 大功完成。。。。。。。

-----------------

  评论这张
 
阅读(1179)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018