PHP(Laravel框架)中使用solr全文搜索服务器 Solarium

一、服务器上搭建solr服务器

1、安装Tomcat8

安装路径/usr/local/tomcat

2、下载solr安装包

wget http://mirrors.hust.edu.cn/apache/lucene/solr/7.4.0/solr-7.4.0.tgz

解压到opt下

3、部署solr

1)进入solr-7.4.0 文件夹

将其下面的server/solr-webapp 拷贝到 tomcat下的webapps里 并将webapp重命名为solr

cp -r /opt/solr-7.4.0/server/solr-webapp/webapp/ /usr/local/tomcat/webapps/

进入webapps执行

mv webapp/ solr

2)拷贝solr-7.4.0\server\lib\ext 下的jar包以及lib目录下gmetric4j-1.0.7.jar,以metrics开头的jar包拷贝到 tomcat\webapps\solr 项目的WEB-INF\lib下

cd /opt/solr-7.4.0/server/lib/ext/

cp * /usr/local/tomcat/webapps/solr/WEB-INF/lib/

进入lib

cp gmetric4j-1.0.7.jar metrics-* /usr/local/tomcat/webapps/solr/WEB-INF/lib/

3)拷贝solr-7.4.0\server 下的solr文件夹到其它非中文目录下,重命名为solrhome,我是建立到了/usr/local下

cd /opt/solr-7.4.0/server/

cp -r solr /usr/local/solrhome

4)修改/usr/local/tomcat/webapps/solr/WEB-INF\web.xml, 找到如下代码,/put/your/solr/home/here 改为你自己的solrhome的路径,我的是/usr/local/solrhome路径。

   vim /data/soft/tomcat/webapps/solr/WEB-INF/web.xml

将注释去掉,并将solrhome的目录位置写进去:

<env-entry>

    <env-entry-name>solr/home</env-entry-name>

    <env-entry-value>/usr/local/solrhome</env-entry-value>

    <env-entry-type>java.lang.String</env-entry-type>

</env-entry>

5)拷贝solr-7.4.0\server\resources下的log4j2.xml到/usr/local/tomcat/webapps/solr/WEB-INF\classes,如果WEB-INF下没有classes文件那么就创建一个classes文件夹

mkdir -p /usr/local/tomcat/webapps/solr/WEB-INF/classes

cp /opt/solr-7.4.0/server/resources/log4j2.xml  /usr/local/tomcat/webapps/solr/WEB-INF/classes/

6)浏览器访问 http://ip:18080/solr/index.html

如出现403错误

找到 /usr/local/tomcat/webapps/solr/WEB-INF/web.xml

找到如下代码,将其注释即可。

<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>

至此solr可以在浏览器上访问

二、建立core,连接数据库

1、建立core

将solr-7.4.0/example/example-DIH/solr/db下的文件 拷贝到 /usr/local/sorlhome/new_core下

cp -r /opt/solr-7.4.0/example/example-DIH/solr/db/* /usr/local/sorlhome/new_core/

在浏览器主界面Core Admin点击Add Core可以在new_core/ 要建立一个data文件夹用来存储数据

2、连接数据库

(1)下载mysql驱动包

 wget http://central.maven.org/maven2/mysql/mysql-connector-java/6.0.6/mysql-connector-java-6.0.6.jar

并将其拷贝到 /usr/local/tomcat/webapps/solr/WEB-INF/lib/

(2)拷贝dist文件夹里的solr-dataimporthandler-7.2.0.jar

cp  /opt/solr-7.4.0/dist/solr-dataimporthandler-* /usr/local/tomcat/webapps/solr/WEB-INF/lib/

(3)拷贝lucene-libs文件夹里的中文分析器的jar包

cp  /opt/solr-7.4.0/contrib/analysis-extras/lucene-libs/* /usr/local/tomcat/webapps/solr/WEB-INF/lib/

(4)打开new_core下的conf目录在db-data-config.xml和managed-schema中进行配置

vim /usr/local/solrhome/new_core/conf/solrconfig.xml

<lib dir="../../../dist/" regex="solr-dataimporthandler-.*\.jar" />  
<lib dir="../../../dist/" regex="mysql-connector-java-.*\.jar" />  

在lib

# 在文件底部

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
     <lst name="defaults">
             <str name="config">data-config.xml</str>
     </lst>
</requestHandler>
vim /usr/local/solrhome/new_core/conf/db-data-config.xml
<?xml version="1.0" encoding="UTF-8" ?>

    <dataConfig>

        <dataSource convertType="true"  type="JdbcDataSource"    driver="com.mysql.jdbc.Driver"

                            url="jdbc:mysql://localhost:3306/数据库名"

                           user="数据库用户名"

                            password="用户名对应的密码"/>

           <document>

               <entity name="user" query="SELECT * FROM user ">

                    <field column="id" name="id"/>

                   <field column="username" name="user_sername"/>

                  <field column="birthday" name="user_birthday"/>

                 <field column="sex" name="user_sex"/>

                <field column="address" name="user_address"/>

          </entity>

     </document>

</dataConfig>

下载ik分词器 并将jar包放在WEB-INF 的lib下

http://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer-solr7/7.x/ik-analyzer-solr7-7.x.jar

vim /usr/local/solrhome/new_core/conf/managed-schema

加入

<!-- ik分词器 -->

<fieldType name="text_ik" class="solr.TextField">

    <analyzer type="index">

        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>

        <filter class="solr.LowerCaseFilterFactory"/>

    </analyzer>

    <analyzer type="query">
    
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>

        <filter class="solr.LowerCaseFilterFactory"/>

    </analyzer>

</fieldType>

三、在PHP中使用solr

1、下载php的solr扩展 https://pecl.php.net/package/solr

注意:php有Thread Safe和NoneThread Safe之分,下载之前,请先确定你安装的php是哪种类型。

下载解压之后,将其中的dll文件放到php的扩展目录,对于php扩展所在目录,然后在php.ini开启solr扩展,再通phpinfo查看是否正常安装。

tt

11

2、在Laravel项目中使用

1)安装Laravel5的solr依赖

composr require solarium/solarium

发现composer.json的"require" 中增加了一项

"solarium/solarium": "^4.0",

2)配置数据库

在app/config/database.php中增加

'solr' => [

    'endpoint' => [

    'localhost' => [

        'host' => 'xxx9.159.1xx.17',  //IP地址

        'port' => 8080,         //端口号

        'core' => null,

        'path' => '/solr/new_core',

        'wt'=>'json',

                    ],

                ],

            ],

3)代码中应用

a.增加索引/更新索引(根据所传id是否已经存在,存在则更新,否则新增)

public function update(Request $request) {

        $data = $request->json()->all();

        $client =new \Solarium\Client(\Config::get('database.solr'));

        $update=$client->createUpdate();

        $doc=$update->createDocument();

        foreach ($data as $key=>$value){

                $doc->$key=$value;

            }

        $update->addDocument($doc);

        $update->addCommit();

        $updateResponse=$client->update($update);

        $res = $updateResponse->getResponse();

        return $res->getStatusCode();

}

b.删除索引

public function delete(Request $request) {

        $data = $request->json()->all();

        $id=$data['id'];

        $client =new \Solarium\Client(\Config::get('database.solr'));

        $update = $client->createUpdate();

        $update->addDeleteById($id);//通过id

        //$update->addDeleteQuery($q);//通过查询条件

        $update->addCommit();

        $result = $client->update($update);

        $res = $result->getResponse();

        return $res->getStatusCode();

}

c.搜索

public function search(Request $request)
    {
        $data = $request->json()->all();
        $key=$data['key'];
        $enp_description=$data['enp_description'];
        $client =new \Solarium\Client(\Config::get('database.solr'));
        $query = $client->createSelect();

//设置q   查询字符串。查询所有是*:* , 根据指定字段查询
        $query->setQuery('all: *' . $key . "*"); //这个是设置keyword

        $result = $client->execute($query);
        $res= $result ->getResponse();
        return $res->getStatusCode();;
    }

猜你喜欢

转载自blog.csdn.net/weixin_38682852/article/details/81112993