thinkphp5扩展使用sphinx coreseek类,tp5的extend

在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补充集成截图
003.jpg

就可以直接使用了

<?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补充集成截图
888.jpg
555.jpg

一些轻量级简单的检索需求,用sphinx coreseek足够,占用资源少。
对于一些复杂应用,数量级很大的,则推荐用 elasticsearch,可于本blog搜索 。

转载请注明出处:https://www.isres.com/php/211.html



Comments : 2

  1. Mr. Huan

    这个thinkphp5扩展使用sphinx coreseek类 按照你的方法不行啊

      1. shw3588

        具体报什么错?就简单的把SphinxClient.php这个文件放到对应的扩展目录中而以呀,这个文件我修改过,加了命名空间,PHP文件可在文章中下载。

发表留言

人生在世,错别字在所难免,无需纠正。

    captcha