本文主要沿着以下三个方向来解开solr使用之谜,让大家使用solr跟使用mysql一样简单方便,安装和介绍部分已经在上一篇solr安装和简介详细介绍,在此就不详述。

  1、solr php客户端实现

  2、solr简单功能使用

  3、solr facet高级功能使用


 一、首先介绍solr用php如何实现链接和数据检索

     //初始化solr服务

    

function init_solrs($cores = ''){
  if(!$solrs){
     require_once 'lib/Solrclient.class.php';
     $solrs = new Solrclient('',$cores);
  }
  return $solrs;
}

     //solr简单的实现

   

wKiom1Z4CJCgQaLzAAIfo9WMKDg868.png

wKioL1Z4CKKywAnGAAH8sB-VFqk535.png

wKiom1Z4CJOAyLngAAH5ay2YVK4720.png

wKioL1Z4CKiRb-bcAAIVtbN_5F4663.png

 solr的php客户端主要是依靠curl来高效请求处理,其中update方法可以添加和修改数据 solr底层会自动判断是否根据schema.xml配置文件的unique_key字段进行判断已经添加过,如果没有添加就执行insert操作如果添加就执行update操作,默认使用json串去执行 还有其他的如xml等处理 这个自己可以根据习惯来处理,这里暂且使用json处理

  二、solr的简单使用方法

    举个列子:这里拿拉勾搜索来举例

    

wKiom1Z4CdjiKYjWAAFRDBk9yxo429.png

  在此咱们给上图搜索属性定义字段来讲解如何实现类似这样的功能

  字段:工作地点:areaid 工作经验:exprience 学历要求:educations 公司阶段:stage 行业领域:industry 排序默认按更新时间:createtime 最新:updatetime 月薪:salarys 工作性质:jobnature等

  在此讲解一下solr的core概念 其实core就类似mysql的数据库表 那么基于上图来说我们可以判断出来至少有2个core来存储相关的数据 一个是职位信息 一个是公司信息 为了方便搜索也可能会在职位信息中冗余一些公司相关属性(公司阶段、行业领域等等 可以通过触发式方式来同步职位和公司数据)

  接下来我们简单讲解一下solr的简单功能各个参数是什么意思如下图所示,高级功能后面再讲解

  wKiom1Z4Dr3AKRKPAADWVsNi8ow965.png

  接下来来看如何通过封装方法来实现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 *] 

 简单的操作就讲解到此

 三、facet功能讲解

 在这里我们也举一个例子 还是拿拉勾来举例

 wKiom1Z4FJGAMe2jAACaQNKnBXo446.png 在本图中我们看到搜索百度后会在下面显示关于百度的所有功能 看到右边的红框中的百度在招聘的职位数和面试评价数 那么这个功能如果通过solr实现 这个在mysql中就是一个group的功能

这里就要用到solr的高级功能facet,facet我的理解就是分组、分类等等 淘宝的经典功能就是通过类facet实现的 比如下图:

 wKioL1Z4FYbwGxj3AAC9Si34iHQ764.png

 补充上面方面里面 用到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

 结果如下图所示:

wKiom1Z4ma_w8V3IAAAWMXMSU3c875.png

wKiom1Z4ma-QhPeTAAAYAVZFosA544.png

 至此简单的facet功能就讲解完毕 后面会继续更新更多的关于facet的功能介绍,在此祝大家晚安