本文主要沿着如下三個方向來解開solr使用之謎,讓你們使用solr跟使用mysql同樣簡單方便,安裝和介紹部分已經在上一篇solr安裝和簡介詳細介紹,在此就不詳述。
php
一、solr php客戶端實現mysql
二、solr簡單功能使用面試
三、solr facet高級功能使用sql
1、首先介紹solr用php如何實現連接和數據檢索數據庫
//初始化solr服務json
function init_solrs($cores = ''){ if(!$solrs){ require_once 'lib/Solrclient.class.php'; $solrs = new Solrclient('',$cores); } return $solrs; }
//solr簡單的實現curl
solr的php客戶端主要是依靠curl來高效請求處理,其中update方法能夠添加和修改數據 solr底層會自動判斷是否根據schema.xml配置文件的unique_key字段進行判斷已經添加過,若是沒有添加就執行insert操做若是添加就執行update操做,默認使用json串去執行 還有其餘的如xml等處理 這個本身能夠根據習慣來處理,這裏暫且使用json處理ide
2、solr的簡單使用方法ui
舉個列子:這裏拿拉勾搜索來舉例url
在此我們給上圖搜索屬性定義字段來說解如何實現相似這樣的功能
字段:工做地點:areaid 工做經驗:exprience 學歷要求:educations 公司階段:stage 行業領域:industry 排序默認按更新時間:createtime 最新:updatetime 月薪:salarys 工做性質:jobnature等
在此講解一下solr的core概念 其實core就相似mysql的數據庫表 那麼基於上圖來講咱們能夠判斷出來至少有2個core來存儲相關的數據 一個是職位信息 一個是公司信息 爲了方便搜索也可能會在職位信息中冗餘一些公司相關屬性(公司階段、行業領域等等 能夠經過觸發式方式來同步職位和公司數據)
接下來咱們簡單講解一下solr的簡單功能各個參數是什麼意思以下圖所示,高級功能後面再講解
接下來來看如何經過封裝方法來實現solr查詢以上數據簡單的實現來拋磚引玉
/* * 從solr中獲取職位信息 */ function getinfofromsolr($where = array()) { //拼接where條件 $search = array(); $search['q'] = "*:*"; //職位的狀態 $search['fq'] = array("status:".(int)$where['status']); //搜索框內容 if(!empty($where['search'])){ //這裏就是類mysql的like操做*內容*這裏沒有分詞 array_unshift($search['fq'],"jobnames:*".$where['search']."*"); } //工做性質 fq主要方式就是字段名:字段值 if(!empty($where['jobnature'])){ array_unshift($search['fq'],"jobnature:".(int)$where['jobnature']); } //工做城市 if(!empty($where['areaid'])){ array_unshift($search['fq'],"areaid:".(int)$where['areaid']); } //工做經驗 if(!empty($where['experience'])){ array_unshift($search['fq'],"experience:".(int)$where['experience']); } //學歷要求 if(!empty($where['educations'])){ array_unshift($search['fq'],"educations:".(int)$where['educations']); } //公司階段 if(!empty($where['stage'])){ array_unshift($search['fq'],"stage:".(int)$where['stage']); } //公司行業領域 if(!empty($where['industry'])){ array_unshift($search['fq'],"industry:".(int)$where['industry']); } //排序功能 if(!empty($where['sort'])){ $search['sort'] = $where['sort']; }else{ $search['sort'] = 'updatetime desc'; } //分頁處理 $search['start'] = 0; $search['rows'] = 20; $search['fl']="jobid,areaid,exprience,educations,stage,industry"; $rows = init_solrs('job')->searchPage($search); return $rows; }
經過上面的代碼便可實現簡單的查詢功能若是相似mysql的in操做能夠簡單的使用solr中的q參數
q:就是query的意思表達式是什麼 好比查職位id爲1,3,6,9,23,467等的操做 能夠這麼寫
job_id:1 or job_id:3 or job_id:6 or job_id:7 or job_id:23 or job_id:467
若是是連續的能夠經過 job_id:[1 TO 10] 也能夠表示大於等於小於 job_id:[1 TO *]
fq:就是多個字段的查詢好比說a大於1而且b大於2就能夠這麼表示q=*:*&fq=a:[1 TO *]&fq=b:[2 TO *]
簡單的操做就講解到此
3、facet功能講解
在這裏咱們也舉一個例子 仍是拿拉勾來舉例
在本圖中咱們看到搜索百度後會在下面顯示關於百度的全部功能 看到右邊的紅框中的百度在招聘的職位數和麪試評價數 那麼這個功能若是經過solr實現 這個在mysql中就是一個group的功能
這裏就要用到solr的高級功能facet,facet個人理解就是分組、分類等等 淘寶的經典功能就是經過類facet實現的 好比下圖:
補充上面方面裏面 用到facet功能
要查找公司下面有多少個職位和多少個面試評價 這裏以分類查找職位數
if(!empty($where['company_id'])){
$search['facet'] = 'true'; //首先要讓facet='true'表示開啓facet功能 糾正一下這裏是字符串'true' 若是是facet=true生成連接就是facet=1 會執行錯誤
$search['facet.field'] = "company_id";//要進行計算統計的字段 在職位信息裏面有公司id那麼根據公司id進行統計就能夠獲得該公司下面有多少個職位數據
$search['facet.limit'] = 10;//這個是要截圖並顯示的個數
}
請求地址以下
http://localhost:8983/solr/job/select?wt=json&indent=1&q=company_id%3A23187+or+company_id%3A4702+or+company_id%3A2275+or+company_id%3A774+or+company_id%3A2148+or+company_id%3A252+or+company_id%3A731+or+company_id%3A12216+or+company_id%3A956+or+company_id%3A9634&fq=status%3A0&sort=update_time+desc&start=0&rows=10&facet=true&facet.field=company_id&facet.limit=10&fl=job_id%2Ccompany_id%2Cjob_name%2Cjobnature%2Csalary%2Careaid%2Cexperience%2Ceducations%2Ccreate_time%2Cupdate_time
結果以下圖所示:
至此簡單的facet功能就講解完畢 後面會繼續更新更多的關於facet的功能介紹,在此祝你們晚安