美文网首页
solr for php配置及调用

solr for php配置及调用

作者: 余头 | 来源:发表于2018-04-27 17:43 被阅读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));
    
    
    
    

    相关文章

      网友评论

          本文标题:solr for php配置及调用

          本文链接:https://www.haomeiwen.com/subject/frrblftx.html