thinkphp3.2整合使用solr

參考文章:

  1. https://www.cnblogs.com/zihai/p/7311412.html
  2. https://blog.csdn.net/weixin_38730732/article/details/81359984?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
  3. https://www.cnblogs.com/JimmyBright/p/7156085.html
    4.https://blog.csdn.net/ailihui366/article/details/102745117
    5.https://blog.csdn.net/qq_39454048/article/details/102581140
    僅測試在windows本地使用 我的環(huán)境是wamp
  1. 安裝solr

下載solr,選擇相應(yīng)版本,注意:因?yàn)閟olr對是基于java的,所以必需安裝jre。每個版本的 solr對jre版本要求不一樣,下載時請注意solr的版本。

我的java版本是:"1.8.0_181"
我用的是solr6.6.0 下載地址 http://archive.apache.org/dist/lucene/solr/6.6.0/

將壓縮包解壓到任意目錄 win+R cmd進(jìn)入命令行模式 cd到solr6.6.0中

啟動solr

運(yùn)行命令: bin\solr.cmd start


image.png

solr默認(rèn)監(jiān)聽的是8983端口

更多命令用法,請使用solr -help,如果solr已經(jīng)啟動,請使用solr start -help。

如果啟動成功,可以在瀏覽器中打開:http://localhost:8983/solr/,使用其web管理客戶端。

image.png

  1. 查看solr范例

先停止solr實(shí)例

bin\solr.cmd stop all  //關(guān)閉所有
或者
bin\solr.cmd stop 8983  //指定端口號

再啟用solr范例

bin\solr.cmd -e techproducts

打開web管理客戶端:http://localhost:8983/solr/,查看結(jié)果

image.png

根據(jù)結(jié)果,可知道,techproducts范例中共有32篇文章。

現(xiàn)在可以嘗試他的查詢功能。
我在q輸入框中輸入了Samsung,其得到的結(jié)果如下圖


image.png
  1. 添加文檔
image
image

添加好后,進(jìn)入查詢界面,看能否查到這篇文檔

image
  1. 刪除文檔
image

返回查詢界面,查詢刪除后的結(jié)果

image
  1. 創(chuàng)建solr項(xiàng)目

現(xiàn)在學(xué)會一些基本的操作,可以自己創(chuàng)建一個項(xiàng)目錄了。

先把停止solr
solr.cmd stop -all
solr是一個實(shí)例可以有多個core或collection,如果不先停止,創(chuàng)建的core將會添加到啟用的techproducts實(shí)例中
solr.cmd create -c test

image.png

重新刷新web客戶端

image
  1. 下載php的solr擴(kuò)展

現(xiàn)在開始使用php和solr交互了,所以必需安裝solr擴(kuò)展。
分兩步:
1.安裝libssh2擴(kuò)展
瀏覽器打開當(dāng)前php,效果如下圖所示,查找對應(yīng)位置信息


image.png

如上圖所示,查看當(dāng)前VC版本, TS還是NTS(線程安全還是非安全),以及X86還是X64。

然后進(jìn)入網(wǎng)站,查找對應(yīng)版本http://windows.php.net/downloads/pecl/releases/ssh2/0.12/

由于當(dāng)前環(huán)境事 X64,TS, VC11,所以我們選擇下面連接下載


image.png

下載后解壓,

安裝
將 php_ssh2.dll、php_ssh2.pdb 放到你的 php 擴(kuò)展目錄下 php/ext/ 下。

將libssh2.dll 復(fù)制到 c:/windows/system32 和 c:/windows/syswow64 (64位系統(tǒng)才有)各一份

php.ini中加入 extension=php_ssh2.dll

檢查安裝
瀏覽器打開剛才的網(wǎng)址,查看phpinfo,可以看到安裝成功


image.png

2.安裝solr擴(kuò)展
下載地址:http://windows.php.net/downloads/pecl/releases/solr/;

將壓縮包的php_solr.dll、php_solr.pdb 放到你的 php 擴(kuò)展目錄下 php/ext/ 下。

php.ini中加入 extension=php_solr.dll

重啟服務(wù)器,查看phpinfo(),是否有顯示solr擴(kuò)展加載成功。

安裝之前需使用phpinfo()查看自己版本信息、下載相匹配的擴(kuò)展
下載擴(kuò)展時注意 ts或者是nts


image.png
  1. 在thinkphp3.2中集成solr

composr 安裝不表
由于php版本低直接 composr require solarium/solarium失敗
所以直接在新目錄創(chuàng)建composer.json文件

{
    "require": {
       "solarium/solarium": "^3.8"
    }
}

然后進(jìn)入到項(xiàng)目根目錄下 cmd執(zhí)行 composr require solarium/solarium 如不成功 可嘗試 composer install/update

image.png

image.png

image.png

  1. tp3.2中代碼

Org/Util中新建SolrClient.class.php 用于查詢


image.png
<?php
namespace Org\Util;
/**
 * @Description: 操作solr
 * @Date:2012.9.1
 * @Version:v1
 * @Author:wujiawei
 */
class SolrClient
{
    public  $query_url='';
    public  $import_url='';
    private $q='q=*.*';
    private $fq='';
    private $sort='';
    private $rows='rows=10&start=0';
    private $fl='';
    private $raw_query='';
    public  $hl_str='';
    function  __construct()
        {
            $core = 'lgbv3';
            $host='localhost:8983';
            $this->query_url=sprintf("%s/solr/%s/select?indent=on&wt=json&",$host,$core);
            $this->import_url=sprintf("%s/solr/%s/dataimport?indent=on&wt=json&command=full-import&verbose=false&clean=true&commit=true&optimize=false&core=crm&name=dataimport",$host,$core);
        }
        public function setQuery(array $query){
            $q_str=[];
            foreach ($query as $k=>$v) {
                if(!empty($v)){
                    $q_str[]=urlencode($v);
                }
            }
            if(!empty($q_str)){
                $this->q='q='.implode(urlencode(' OR '),$q_str);
            }
        }
        public function setFilterQuery(array $query){
            $q_str=[];
            foreach ($query as $k=>$v) {
                $q_str[]='fq='.urlencode($v);
            }
            $this->fq=implode('&',$q_str);
        }
        public function setRows($start,$rows){
            $this->rows=sprintf('rows=%s&start=%s',$rows,$start);
        }
        public function setHighLight(array $fields,$hlpre,$hlpost){
            $hl_fl=[];
            foreach ($fields as $field) {
                $hl_fl[]=$field;
            }
            $this->hl_str=sprintf("hl.fl=%s&hl.simple.post=%s&hl.simple.pre=%s&hl=on",implode(',',$hl_fl),urlencode($hlpost),urlencode($hlpre));
        }
        public function setFl(array $fields){
            $hl_fl=[];
            foreach ($fields as $field) {
                $hl_fl[]=$field;
            }
            $this->fl='fl='.implode(',',$hl_fl);
        }
        public function setRawQuery(array $params){
            $raw=[];
            foreach ($params as $k=>$v) {
                $raw[]=$k.'='.$v;
            }
            $this->raw_query=implode('&',$raw);
        }
        public function sortQuery($field,$sort){
            $this->sort= "sort=".$field.urlencode(' ').$sort;
        }
        
        /**
         * 搜索查詢
         * @return mixed
         */
        public function search(){
            $this->query_url.=$this->q;
            !empty($this->fq)&&$this->query_url.='&'.$this->fq;
            !empty($this->sort)&&$this->query_url.='&'.$this->sort;
            !empty($this->rows)&&$this->query_url.='&'.$this->rows;
            !empty($this->fl)&&$this->query_url.='&'.$this->fl;
            !empty($this->raw_query)&&$this->query_url.='&'.$this->raw_query;
            !empty($this->hl_str)&&$this->query_url.='&'.$this->hl_str;
            
            return $this->getCurl($this->query_url);
        }
        
        /**
         * 全量重構(gòu)索引
         * @return mixed
         */
        public  function index(){
            return $this->getCurl($this->import_url);
        }
        private  function getCurl($url){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL,$url);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $data = curl_exec($curl) ;
            curl_close($curl);
            return json_decode($data,true);
        }
}

使用solr的 控制器 包含增刪改查

<?php
namespace Demo\Controller;
use Think\Controller;
use Solarium\Client;
header('Content-Type:text/html;charset=utf-8');
class IndexController extends Controller{
    public function actionSearch(){
        $input = I('input');//查詢的文字
        $page  = I('page')-1;//頁數(shù)
        empty($page)&&$page=0;
        $pageLength=10;//默認(rèn)條數(shù)
        $page<0&&$page=0;
        $startRow = $page*$pageLength;
        $params=explode(",",$input);

        //調(diào)用示例
        //實(shí)例化
        $solr = new\Org\Util\SolrClient();
        //設(shè)置查詢文字
        $solr->setQuery($params);
        //$startRow頁數(shù)  $pageLength條數(shù) 
        $solr->setRows($startRow,$pageLength);
        //getField 只拿這些字段
        $solr->setFl(['id','name','third_cat_name','attributes','cover_image']);
        //高亮突出
        $solr->setHighLight(['name','third_cat_name'],"<b style='color: #f15353;'>","</b>");
        //最終查詢
        $data = $solr->search();
        $response=&$data['response'];
        $docs = &$response['docs'];
        dump($docs);die;
    }
    
    /**
     * 增加索引/更新索引(根據(jù)所傳id是否已經(jīng)存在,存在則更新,否則新增)
     * @return \Illuminate\Support\Collection
     */
    public function updateSearchProduct(){
        $options = [
                'endpoint' => [
                        'localhost' => [
                                'host' => '127.0.0.1',  //IP地址
                                'port' => 8983,         //端口號
                                'core' => null,
                                'path' => '/solr/lgbv3',
                                'wt'=>'json',
                        ],
                ],
        ];
        $client = new Client($options);
    
        $data=array(
                "id"=>"15340",
                "sid"=>9867,
                "shop_id"=>41,
                "second_cat_name"=>"攝像機(jī)",
                "first_cat_name"=>"視頻監(jiān)控",
                "price"=>380.0,
                "name"=>"??低昉OE供電網(wǎng)絡(luò)監(jiān)控攝像頭",
                "third_cat_name"=>"網(wǎng)絡(luò)高清攝像機(jī)",
                "attributes"=>"3:機(jī)型,12:槍型;4:分辨率,27:500萬像素;5:供電,33:DC12V;6:紅外夜視,40:30米;9:外殼,98:鋁合金",
                "cover_image"=>"http://xxxx.com/upload/image/19480/qp3z5ujfw2nxy4mtclhg1533605053.jpg",
                "brand"=>"??低?,
        );
        $update=$client->createUpdate($data);
        $doc=$update->createDocument();
        foreach ($data as $key=>$value){
            $doc->$key=$value;
        }
        $update->addDocument($doc);
        $update->addCommit();
        $updateResponse=$client->update($update);
        $res = $updateResponse->getResponse();
        dump($res);die;
    }
    /**
     * 刪除索引
     */
    public function delete() {
        $id='EN70906025';
        //solr數(shù)據(jù)庫配置
        $options = [
                'endpoint' => [
                        'localhost' => [
                                'host' => '127.0.0.1',  //IP地址
                                'port' => 8983,         //端口號
                                'core' => null,
                                'path' => '/solr/lgbv3',//solr 索引庫位置
                                'wt'=>'json',
                        ],
                ],
        ];
    
        $client = new Client($options);//實(shí)例化 solr類
         
        $update = $client->createUpdate();
         
        $update->addDeleteById($id);//通過id
         
        $update->addCommit();
         
        $result = $client->update($update);
         
        $res = $result->getResponse();
         
        $a = $res->getStatusCode();
        dump($a);
        dump($res);die;
         
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容