linux下php支持sphinx的扩展安装

xiaoxiao2021-02-28  102

php对于sphinx的扩展支持安装: Coreseek官方教程中建议php使用直接include一个php文件进行操作,事实上php有独立的sphinx模块可以直接操作coreseek(coreseek就是sphinx!)已经进入了php的官方函数库,而且效率的提升不是一点点!但php模块依赖于libsphinxclient包 如果不安装他则会报:  ./configure 的时候可能出错,提示 checking for libsphinxclient headers in default path... not found configure: error: Cannot find libsphinxclient headers , 解决方法如下: 进入coreseek-3.2.14/csft-3.2.14/api/libsphinxclient目录,编译安装libsphinxclient即可 一,那么首先安装这个依赖: cd /usr/local/src/coreseek-4.1-beta/csft-4.1/api/libsphinxclient 报如下错误; config.status: creating Makefile config.status: error: cannot find input file: Makefile.in 这是因为configure.in的文件格式不对(是dos格式),用编辑器打开configure.in文件,将其重新保存为 unix格式,当然不先查看下是否是格式不对  :set ff     > vi configure.in       vi > set fileformat=unix       vi > wq       > aclocal       > autoconf       > automake -a       > ./configure 如果格式正确: aclocal libtoolize --force automake --add-missing autoconf autoheader make clean 执行以上命令再次进行安装 ./configure --prefix=/usr/local/sphinxclient 二, ___________________________________________________________________________________________________________________ PHP5版本才适用: 下载并安装sphinx的php扩展 地址 :http://pecl.php.net/package/sphinx   wget http://pecl.php.net/get/sphinx-1.3.3.tgz     tar zxvf sphinx-1.3.3.tgz     cd sphinx-1.3.3 ./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinxclient 上面版本会报错:   php_sphinx_client_handlers.read_property = php_sphinx_client_read_property;                                            ^ make: *** [sphinx.lo] Error 1 这个报错,修改 sphinx.c 第105行为: retval = std_hnd->read_property(object, member, type TSRMLS_CC, NULL); 然后编译即可通过 4 编辑 php.ini extension=sphinx.so 前提是你的PHP版本不是7. 否则因为版本不符,无法修复,可安装适配PHP7的sphinx扩展。 ----------------------------------------------------------------------------------------------------------------------------------- 如果是php7版本: 版本地址:git.php.net/?p=pecl/search_engine/sphinx.git;a=shortlog;h=refs/heads/php7 下载地址:http://git.php.net/?p=pecl/search_engine/sphinx.git;a=snapshot;h=339e123acb0ce7beb2d9d4f9094d6f8bcf15fb54;sf=tgz  ---可能下载下来为index.html文件,那就下载到本地然后rz上去。 接下来接着安装: 这里现在的版本为:sphinx-339e123.tar.gz tar -zxf sphinx-339e123.tar.gz cd sphinx-339e123 ./configure --prefix=/usr/local/sphinxextend --with-php-config=/usr/local/php-fpm/bin/php-config --with-sphinx=/usr/local/libsphinxclient/ make && make install Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20160303/ 然后可以cd到这个目录去看下结果: cd /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20160303/ 可以看到里面有sphinx.so 然后找到php.ini 在里面添加extension=spninx.so 然后使用php-m 或者看下phpinfo(); 能看到sphinx即可。 注:执行php脚本之前要先启动sphinx服务,在shpinx安装目录的bin目录下执行./searchd 启动sphinx服务

然后可以使用php来调用sphinx:

sphinx查询索引出来的结果默认为一个关联数组,其中id对应的为从数据库取出来的数据库主键ID,也就是说使用sphinx的表必须存在主键,否则不能返回结果。

实例一: <?php         $s = new SphinxClient;         $s->setServer("127.0.0.1", 9312);              $s->setMatchMode(SPH_MATCH_PHRASE);         $s->setMaxQueryTime(30);         $res = $s->query("宝马",'main'); #[宝马]关键字,[main]索引源source         $err = $s->GetLastError();         var_dump(array_keys($res['matches']));         echo "<br>"."通过获取的ID来读取数据库中的值即可。"."<br>";                  echo '<pre>';         var_dump($res);         var_dump($err);         echo '</pre>';   实例二: <?php $sphinx = new SphinxClient; $sphinx->setServer("localhost", 9312); $sphinx->setMatchMode(SPH_MATCH_ANY);   //匹配模式 ANY为关键词自动拆词,ALL为不拆词匹配(完全匹配) $sphinx->SetArrayResult ( true );    //返回的结果集为数组 $result = $sphinx->query("test","*");    //星号为所有索引源 $count=$result['total'];        //查到的结果条数 $time=$result['time'];            //耗时 $arr=$result['matches'];        //结果集 $id=''; for($i=0;$i<$count;$i++){     $id.=$arr[$i]['id'].','; }

$id=substr($id,0,-1);            //结果集的id字符串

实例三,支持分页的:

<?php        header("Content-type: text/html; charset=utf-8");        require("./sphinxapi.php");        $s = new SphinxClient;        $s->setServer("192.168.252.132", 9312);                //SPH_MATCH_ALL, 匹配所有查询词(默认模式); SPH_MATCH_ANY, 匹配查询词中的任意一个; SPH_MATCH_EXTENDED2, 支持特殊运算符查询        $s->setMatchMode(SPH_MATCH_ALL);        $s->setMaxQueryTime(30);                             //设置最大搜索时间        $s->SetArrayResult(false);                           //是否将Matches的key用ID代替        $s->SetSelect ( "*" );                               //设置返回信息的内容,等同于SQL        $s->SetRankingMode(SPH_RANK_BM25);                   //设置评分模式,SPH_RANK_BM25可能使包含多个词的查询的结果质量下降。         //$s->SetSortMode(SPH_SORT_EXTENDED);                //发现增加此参数会使结果不准确        //$s->SetSortMode(SPH_SORT_EXTENDED,"from_id asc,id desc");  //设置匹配项的排序模式, SPH_SORT_EXTENDED按一种类似SQL的方式将列组合起来,升序或降序排列。        $weights = array ('company_name' => 20);        $s->SetFieldWeights($weights);                        //设置字段权重        $s->SetLimits ( 0, 30, 1000, 0 );      //设置结果集偏移量  SetLimits (便宜量,匹配项数目,查询的结果集数默认1000,阀值达到后停止)        //$s->SetFilter ( $attribute, $values, $exclude=false );     //设置属性过滤        //$s->SetGroupBy ( $attribute, $func, $groupsort="@group desc" );    //设置分组的属性        $res = $s->query('@* "汽车"','main','--single-0-query--'); #[宝马]关键字,[news]数据源source                        //代码高亮        $tags = array();        $tags_name = array();        foreach($res['matches'as $key=>$value){            $tags[] = $value['attrs'];            $company_name[] = $value['attrs']['company_name'];            $description[] = $value['attrs']['description'];        }        $company_name = $s->BuildExcerpts ($company_name'main''汽车'$opts=array() );     //执行高亮,这里索引名字千万不能用*        $description = $s->BuildExcerpts ($description'main''汽车'$opts=array() );       //执行高亮,这里索引名字千万不能用*        foreach($tags as $k=>$v)        {            $tags[$k]['company_name'] = $company_name[$k];  //高亮后覆盖            $tags[$k]['description'] = $description[$k];    //高亮后覆盖        }                // 高亮后覆盖        $i = 0;        foreach($res['matches'as $key=>$value){            $res['matches'][$key] = $tags[$i];            $i++;        }                $err = $s->GetLastError();                echo '<pre>';        var_export($res);        var_export($err);        echo '</pre>';    生成索引时如果出现如下错误: FATAL: failed to lock /usr/local/sphinx/var/data/test1.spl: Resource temporarily unavailable, will not index. Try --rotate option. 请改用命令  ./indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate

转载请注明原文地址: https://www.6miu.com/read-31406.html

最新回复(0)