在thinkphp5中使用sphinx相对比较简单,标准规范的方法自然是把sphinx api文件放到extend中。
根据tp5的规范说明
#如果你需要在核心之外扩展和使用第三方类库,并且该类库不是通过Composer安装使用,那么可以直接放入应用根目录下面的#extend目录下面,该目录是官方建议的第三方扩展类库目录。
#类的命名规范遵循PSR-2及PSR-4规范,例如,如果有一个扩展类库的命名空间是 first.second.Foo,类定义如下:
namespace first\second;
class Foo
{
}
#使用第三方类库的时候注意不要和系统的命名空间产生冲突,例如核心的think、app以及Composer类库自身定义的命名空间。
#那么实际的类文件位置应该是:
extend/first/second/Foo.php
#使用first.second.Foo类的时候,直接实例化即可使用,例如:
$foo = new \first\second\Foo();
准备这样使用sphinx
$cl = new \sphinx\SphinxClient();
必须在extend目录下创建sphinx目录,然后放SphinxClient.php
, SphinxClient.php
命名空间 namespace sphinx
;
文件于附件 SphinxClient.zip
如果你自己下载的SphinxClient.php理应修改一下才能集成进来,也可直接下载我的 20190718补充集成截图
。
就可以直接使用了
<?php
namespace app\index\controller;
class Index
{
/**
* @param $index 索引名称
* @param $str 检索内容
* @param $page 分页页码
* @param $page_size 分页大小
* @param int $model 检索模式
* @param int $rand 是否随机返回
* @return array 一个数字,返回指定数据的内容id 可用于 in查询 和 总数
*/
private function sphinx_search($index,$str,$page,$page_size,$model = 0,$rand=1){
$cl = new \sphinx\SphinxClient();
$cl->SetServer ('127.0.0.1', 9312);
$cl->SetConnectTimeout ( 3 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_ANY );
//$cl->SetMatchMode ( SPH_MATCH_EXTENDED2 );//常用默认 类似 SPH_MATCH_EXTENDED ,并支持评分和权重.
//$cl->SetMatchMode ( SPH_MATCH_PHRASE );//将整个查询看作一个词组,要求按顺序完整匹配
$cl->SetRankingMode ( SPH_RANK_WORDCOUNT );
//$cl->SetRankingMode (SPH_RANK_PROXIMITY_BM25);
$cl->SetLimits($page*$page_size, 160, 1000);
if($model == 0 || $model == 3)$cl->SetSortMode ( SPH_SORT_EXTENDED, '@id DESC' ); //排序
if($model == 1)$cl->SetSortMode ( SPH_SORT_EXTENDED, '@weight DESC' );//权重
if($model == 3)$cl->setRankingMode (SPH_RANK_NONE);
$res = $cl->Query($str,$index);
$cl->Close();
$id_arr = array_column($res['matches'],'id');
if($rand)shuffle($id_arr);
$id_arr = array_slice($id_arr,0,$page_size);
$id = implode(',',$id_arr);
return Array('ids'=>$id,'counts'=>$res['total_found']);
}
public function index()
{
$result = $this->sphinx_search('index1','北京市','0','10',0);
print_r($result);
}
}
收到评论反馈有朋友用不起来,特别补充了一些截图和注释,如果依旧有问题可以继续留言。
我的这个使用function 是根据自己需要写的,运行效果图如下。20190718补充集成截图
一些轻量级简单的检索需求,用sphinx coreseek足够,占用资源少。
对于一些复杂应用,数量级很大的,则推荐用 elasticsearch,可于本blog搜索 。
标签: thinkphp
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.isres.com/php/211.html
这个thinkphp5扩展使用sphinx coreseek类 按照你的方法不行啊
具体报什么错?就简单的把SphinxClient.php这个文件放到对应的扩展目录中而以呀,这个文件我修改过,加了命名空间,PHP文件可在文章中下载。
多字段,and 查询怎么处理
。。。。