solr for php配置及调用

2018-04-27  本文已影响0人  余头

solr是一个基于lucene的全文搜索服务器

一、准备工具

1、tomcat、 jdk
2、solr7.3
3、mysql-connector-java.jar
4、php-solr扩展
5、SolrPhpClient

工具包链接: https://pan.baidu.com/s/1ByRslAFGn8EU9se5Y1vLCQ 密码: 6dbi

二、服务安装文件配置

1、安装java环境及solr下载;
2、将solr目录server\solr-webapp\webapp文件夹复制到tomcat的webapps下并修改文件夹名称为solr;
3、把solr-7.2.1/server/lib/ext目录下的所有jar包、solr-7.2.1/dist下的solr-dataimporthandler-6.4.1.jar、solr-dataimporthandler-extras-6.4.1.jar和solr/server/lib下metrics开头的5个jar 、mysql-connector-java.jar(mysql驱动包)粘贴复制到tomcat下的solr项目的WEB-INF/lib目录下;
4、在tomcat下的solr项目的WEB-INF下新建classes目录,然后把solr-6.4.1/server/resources下的log4j.properties粘贴过去;
5、把server目录下的solr文件夹粘贴复制到solr目录,然后重命名为:solrhome,作为solr核心文件夹;
6、修改tomcat下的solr项目的WEB-INF/web.xml并注释掉权限设置

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>F:\solr7\solrhome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
<!--<security-constraint>
    <web-resource-collection>
      <web-resource-name>Disable TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method>TRACE</http-method>
    </web-resource-collection>
    <auth-constraint/>
  </security-constraint>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Enable everything but TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method-omission>TRACE</http-method-omission>
    </web-resource-collection>
  </security-constraint>-->

7、启动tomcat 浏览器输入http://127.0.0.1:8080/solr/index.html#/ 显示solr管理界面即配置完成

三、数据库导入并建立中分分词器

1、将solr7\server\solr\configsets\下的_default文件夹复制到solr7\solrhome下并更改为jun
2、_default的conf目录下建立一个db-data-config.xml文件
对应solrconfig.xml里修改为db-data-config.xml
3、编辑db-data-config.xml文件

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db" user="root" password="" />
    <document>
        <entity name="product" query="select * from product"
                >
            <field column="id" name="id" />
            <field column="title" name="title" />
        </entity>
    </document>
</dataConfig>

4、F:\solr7\contrib\analysis-extras\lucene-libs找到lucene-analyzers-smartcn-7.3.0.jar复制到webapp\wEB-INF\lib下
5、修改managed-shchema 加入中文配置

<!-- ChineseAnalyzer -->
    <fieldType name="solr_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
      </analyzer>
    </fieldType>

6、添加库


图片.png

7、选择Schema配置字段


图片.png
8、点击DataImport
图片.png

9、点击Query即可看到导入的数据


图片.png
四、php客户端调用
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/4/27
 * Time: 13:45
 */
require_once "Solr/Service.php";
class SolrSearch
{
    private static $options = array('hostname' => '127.0.0.1','port' => '8080');


    /**
     * 设置solr库
     */
    public static function setCore($core)
    {
        if($core) self::$options['path'] = 'solr/'.$core;
    }

    /**
     * php通过solr文件包连接服务器端
     */
/* public static function solr_server(){
        $solr = new Apache_Solr_Service( self::SOLR_HOST, self::SOLR_PORT, self::SOLR_URL );
        if ( ! $solr->ping() ) {
            echo 'Solr service not responding.';
            exit;
        }
    }
*/

    /**
     * 增加solr索引
     * @param $fieldArr 索引字段及值
     * @return bool true
     */
    public static function addDocument($fieldArr=array()){
        $client = new SolrClient(self::$options);
        $doc = new SolrInputDocument();
        foreach($fieldArr as $k => $v){
            $doc->addField($k,$v);
        }
        $client->addDocument($doc);
        $client->commit();
        return true;
    }

    /**
     * 删除索引
     * @param $id 主键id id可以为数组形式,应用于多选的情况
     * @return bool true
     */
    public static function delDocument($ids){
        $client = new SolrClient(self::$options);
        if(is_array($ids))
            $client->deleteByIds($ids);
        else
            $client->deleteById($ids);
        $client->commit();
        return true;
    }

    /**
     * 查询数据
     * @param $qwhere     关键字
     * @param $fqwhere 附加条件,根据范围检索,适用于数值型
     * @param $getField    查询字段
     * @param $sort 排序 array('duration'=>'asc')  asc:升序,desc:降序
     * @param $pageindex   查询页数
     * @param $pagesize    每页显示条数
     */
    public static function selectQuery($qwhere=array(),$fqwhere=array(),$getField=array(),$sort=array(),$pageindex=1,$pagesize=20){
        $client = new SolrClient(self::$options);
        $query = new SolrQuery();
        $sel = '';
        foreach($qwhere as $k => $v){
            $sel .= ' +'.$k.':'.$v;        //对中文分词的field用这行
//        $sel = "{$k} : \"*{$v}*\"";    //对英文貌似$v两侧加*号就能模糊搜索了
        }
        $query->setQuery($sel);
        //关键字检索

        //附加条件,根据范围检索,适用于数值型
        if($fqwhere){
            $query->setFacet(true);
            foreach($fqwhere as $k => $v)
                $query->addFacetQuery($v);
            //$query->addFacetQuery('price:[* TO 500]');
        }

        //查询字段
        if($getField){
            foreach($getField as $key => $val)
                $query->addField($val);
        }
        //排序
        if($sort){
            foreach($sort as $k => $v){
                if($v == 'asc')
                    $query->addSortField($k,SolrQuery::ORDER_ASC);
                elseif($v == 'desc')
                    $query->addSortField($k,SolrQuery::ORDER_DESC);
            }
        }
        //分页
        $query->setStart(self::getPageIndex($pageindex,$pagesize));
        $query->setRows($pagesize);

        $query_response = $client->query($query);
        $response = $query_response->getResponse();
        return $response;
    }

    /**
     * 分页数据处理
     */
    private static function getPageIndex($pageindex,$pagesize){
        if($pageindex<=1)
            $pageindex = 0;
        else
            $pageindex = ($pageindex-1)*$pagesize;
        return $pageindex;
    }
}

SolrSearch::setCore('jun');

//查询
$q = array(
    'title'=>'星'
);

print_r(SolrSearch::selectQuery($q));



上一篇下一篇

猜你喜欢

热点阅读