記Solr學習心得

一、Solr的安裝使用

Solr以前的版本須要依託於Tomcat做爲載體才能進行使用,不過如今Solr已經支持獨立運行,解壓後運行指令即可啓用。安裝以前須要注意,Solr 8版本所須要的JDK須要8.0或以上。html

[root@localhost]# wget http://mirror.bit.edu.cn/apache/lucene/solr/8.0.0/solr-8.0.0.tgz
[root@localhost]# tar -zxvf solr-8.0.0.tgz
複製代碼

Solr的目錄結構

  • bin/
    該目錄包含了幾個重要的腳本,使用這些腳本可以更加便捷的使用Solr。
    • solr and solr.cmd
      這是Solr的控制腳本,bin/solr(*nix下),bin/solr.cmd(Windows下)。這也是Apache最爲推薦的去啓動或中止Solr的運行工具。
    • post
      提供簡單的命令行模式將內容post到Solr上。
    • solr.in.sh and solr.in.cmd
      這分別是*nix和Windows下的屬性文件。在這裏你能夠設置Jetty、Java、Solr的系統權限屬性。
  • contrib/
    該目錄下提供了一些額外插件,可針對不一樣的使用場景使用這些插件。
  • dist/
    該目錄下包含了Solr運行的主要.jar文件。
  • docs/
    該文件夾下含有一個連接,經過此連接能訪問在線的Solr的javadoc。
  • example/
    該文件夾下包含了幾個使用Solr各部分功能的實例。
  • licenses/
    該文件夾下包括了Solr所使用到的第三方jar包的使用許可證。
  • server/
    該文件夾是solr的核心,readme文檔提供了一個詳細的簡介,須要注意的:
    • Solr的管理UI(server/solr-webapp)
    • Jetty依賴(server/lib)
    • 日誌文件(server/logs)以及日誌配置文件(server/resources)
    • 配置文件模板(server/solr/configsets)

啓動Solr

進入bin目錄下經過腳本啓動Solr:java

[root@localhost]# cd solr-8.0.0/bin
[root@localhost]# ./solr start
複製代碼

當一上來啓動時,系統會以下報錯,表示您的最大打開文件數、最大進程數應該上調到65000。若是root用戶啓動還會警告存在風險,須要添加-force纔可啓動。mysql

*** [WARN] *** Your open file limit is currently 1024.  
 It should be set to 65000 to avoid operational disruption. 
 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
*** [WARN] ***  Your Max Processes Limit is currently 7183. 
 It should be set to 65000 to avoid operational disruption. 
 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
 WARNING: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
         Please consult the Reference Guide. To override this check, start with argument '-force'
複製代碼

咱們能夠經過修改打開文件、進程限制值解決限制的問題,也能夠經過修改solr.in.sh關閉SOLR_ULIMIT_CHECKS檢查,強制啓動。web

[root@localhost]# vim solr.in.sh 
複製代碼

修改配置

[root@localhost]# ./solr start -p 8983 -force # -p 指定端口默認8983 -force(root用戶必選) 
NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 80.

Started Solr server on port 80 (pid=19359). Happy searching!
 [root@localhost]# 
複製代碼

訪問一下,看到儀表盤即爲大功告成:spring

成功界面

二、建立core

在管理頁面建立core以前,須要在server下的solr目錄下創建一個和將要建立core同名的文件夾。並在該文件夾下建立conf(配置文件夾),將配置文件放入其中。在server/solr/configsets/目錄下有能夠直接拽過來用的配置模板,本文直接把_default下的conf文件夾拽過來使用。sql

[root@localhost]# cd solr-8.0.0/server/solr
[root@localhost]# mkdir test # 爲將要建立core的名稱
[root@localhost]# cp -rf configsets/_default/conf test/
複製代碼

而後咱們去Solr管理界面建立core: shell

建立
出現下圖即爲建立成功:
建立成功

三、管理頁面操做core

在操做Core以前,須要在建立的core的conf下的managed-schema文件中添加須要用到的字段。關於Documents、Fields、Schema的設計可在官方文檔中查看。除了幾個默認字段,本文所用到的:數據庫

<field name="company" type="string" multiValued="false" indexed="true" stored="true"/>
 <field name="person" type="string" multiValued="false" indexed="true" stored="true"/>
複製代碼

添加完了去刷新一下core apache

刷新
以後再查看對應core下的 Schema選項,出現相應字段即爲添加成功:
添加成功

添加

在旁邊一列的Documents下進行添加操做: vim

添加操做

查詢

旁邊的Query界面中可進行查詢。q下面的一行表示查詢的參數,左 * 是字段名,右 * 是查詢條件, *表明任意值,下圖爲查詢全部記錄:

查詢操做

更新

Solr中的全部字段中存在一個惟一索引字段,可在managed-schema中的 <uniqueKey></uniqueKey>中定義,默認id字段爲惟一索引。修改時只須要再次添加惟一索引字段索引的內容便可完成更新替換。

更新
更新後:
更新後

刪除

在添加界面內(Documents)的Document Type中選擇XML方式,可根據id和根據查詢進行刪除。

根據id刪除

<delete>
    <id>1</id>
</delete>
<commit/>
複製代碼

根據查詢刪除

<delete>
    <query>person:馬化騰</query>
</delete>
<commit/>
複製代碼

四、整合SpringBoot使用Solr

引入依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-solr</artifactId>
        </dependency>
複製代碼

配置

spring:
 data:
 solr:
 host: http://192.168.78.132:8983/solr/test    #http://你的地址/solr/你建立的core的名稱
複製代碼

實體類

package com.yurui.solrjdemo.entity;

import org.apache.solr.client.solrj.beans.Field;

public class Info {
    @Field     //將要添加到Solr中的字段的註解
    private String id;
    @Field
    private String person;
    @Field
    private String company;
    //setters,getters,toString省略
}

複製代碼

基本的Demo

package com.yurui.solrjdemo;

import com.yurui.solrjdemo.entity.Info;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.ArrayList;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SolrjdemoApplicationTests {
    @Autowired
    private SolrClient solrClient;

    @Test
    public void test() throws IOException, SolrServerException {
        // 普通字段添加
        SolrInputDocument solrDocument = new SolrInputDocument();
        solrDocument.addField("id", "1");
        solrDocument.addField("person", "李彥宏");
        solrDocument.addField("company", "百度");
        solrClient.add(solrDocument);
        // 實體類添加
        Info info = new Info();
        info.setId("2");
        info.setPerson("無名氏");
        info.setCompany("無名氏");
        solrClient.addBean(info);
        // 提交
        solrClient.commit();
        getAll();
        // 經過查詢刪除
        solrClient.deleteByQuery("company:百度");
        solrClient.commit();
        getAll();
        // 經過id刪除
        solrClient.deleteById("2");
        solrClient.commit();
        getAll();
    }

    /* 查詢全部 */
    public void getAll() throws IOException, SolrServerException {
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery("*:*");                   //設置查詢參數
        QueryResponse response = solrClient.query(solrQuery);
        System.out.println("全部信息:");
        ArrayList<Info> list = (ArrayList<Info>) response.getBeans(Info.class);
        for (Info temp : list) {
            System.out.println(temp);
        }
    }
}


複製代碼

測試效果:

測試效果

五、導入MySQL數據庫的內容

數據表

本人用到的數據表結構與數據:

結構
數據

導入jar包

導入數據庫數據須要把MySQL驅動mysql-connector-java-8.0.15.jar,Solr目錄中dist/下的solr-dataimporthandler-8.0.0.jarsolr-dataimporthandler-extras-8.0.0.jar移動到server/solr-webapp/webapp/WEB-INF/lib下。

修改配置

在core的配置文件夾中的solrconfig.xml中添加:

<requestHandler name="/dataimport" class="solr.DataImportHandler">
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
  </requestHandler>
複製代碼

以後再在配置文件夾中創建與<str></str>中同名文件,並進行配置:

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="你的url" user="你的用戶" password="你的密碼" />
    <document>
        <entity name="info" query="select * from info">
            <field column="id" name="id" />
            <field column="person" name="person" />
            <field column="company" name="company" />
        </entity>
    </document>
</dataConfig>
複製代碼

entityquery對應得到數據的SQL語句。field標籤中column對應數據庫的字段名,name對應managed-schema中的字段名。在運行以前須要確保相應字段已經在managed-schema中定義,而且可以成功訪問到數據庫。

測試效果

先重啓一下Solr,而後去管理界面對應Core下的Dataimport下操做:

導入操做
成功後會顯示成功創建/更新索引:
成功創建
查詢一下:
查詢結果
到此,已經完成從數據庫進行數據的導入。

六、中文分詞器

Solr官方自帶了簡體中文分詞器HMM Chinese Tokenizer,存放在contrib/analysis-extras/lucene-libs下的lucene-analyzers-smartcn-8.0.0.jar

導入jar包

首先使用這個插件須要咱們把lucene-analyzers-smartcn-8.0.0.jar移動到server/solr-webapp/webapp/WEB-INF/lib

修改配置

在對應core下的managed-schema中添加以下示例配置(來自官方文檔示例):

<fieldType name="text_cn" class="solr.TextField">    
      <analyzer>
        <tokenizer class="solr.HMMChineseTokenizerFactory"/>
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" words="你所定義的中文停用詞表"/>
        <filter class="solr.PorterStemFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
複製代碼

測試效果

修改完後重啓Solr,進入管理界面對應core下的Analysis,出現fieldType中對應的name即爲添加成功。

添加成功
當咱們嘗試分詞「今天是假期的最後一天」對應結果:
嘗試分詞
至此說明中文分詞添加配置完成。接下來咱們建立一個字段進行測試:

<field name="testChinese" type="text_cn" multiValued="false" indexed="true" stored="true"/>
複製代碼

而後添加剛纔測試的語句,「今天是假期的最後一天」:

語句
根據剛纔測試分詞的結果,若是輸入「假期」會搜索出對應記錄,而輸入「假」對應爲空,實際結果:
輸入假期
輸入假
可發現,實際結果與預期相符,分詞一項測試成功。若對此分詞器分詞效果不滿意,也可更換比較出名的IK分詞器。
相關文章
相關標籤/搜索