Solr安裝、中文分詞以及定時更新索引

Solr安裝及使用

1、安裝

  • 1.官網下載地址 直接下載 zip格式便可
  • 2.解壓下載的壓縮包便可完成Solr安裝。
  • 3.打開DOS,路徑切換至solr_home\bin,執行命令:solr start –p 8983,將solr在8983端口運行,看到如下圖片就證實solr啓動成功了。(Solr默認端口爲8983)

solr經常使用的命令php

solr start -p p_num 啓動solr
solr restart -p p_num 重啓solr
solr stop -p p_num 關閉solr
solr create -c c_name 建立一個核心
複製代碼
  • 4.在瀏覽器訪問:localhost:8983 ,出現如些頁面

solr 的安裝工做到此就結束了。html

2、建立核心

2.1 建立核心前準備工做

每一個核心都是solr的一個實例,一個solr服務能夠建立多個核心,每一個核心均可以進行本身獨立配置。java

  • 1.切換至solr_home\server\solr目錄,例如:E:\solr-8.1.1\server\solr,在該目錄下建立一個文件夾,文件夾名稱與核心名稱相同。
    _v_images/2019062
  • 2.將E:\solr-8.1.1\server\solr\configsets_default路徑下的conf文件夾複製到new_core目錄(E:\solr-8.1.1\server\solr\new_core)下。

2.2 建立核心

方式一:打開solr界面,進行如圖順序操做。

這種方式 須要 在 E:\solr-8.1.1\server\solr 目錄下建立 new_core文件夾mysql

方式二:bin目錄下輸入命令:solr create -c new_core (推薦)

3、schema

每一個核心core中都有這麼一個 schema配置文件。 schema文件能夠對索引庫的數據類型進行定義,對字段是否進行索引、存儲等進行配置,須要針對狠心單獨進行配置。 schema的數據類型進本夠用,若是不能知足需求,好比說對中文分詞、拼音分詞等,就能夠自定義分詞器。 Solr8.1.1 的schema的配置文件名 爲managed-schema,home\server\solr\new_core\conf\managed-schema(E:\solr-8.1.1\server\solr\core_issuer\conf)。web

3.1 schema主要成員

  • (1) fieldType:爲field定義類型,最主要做用是定義分詞器,分詞器決定着如何從文檔中檢索關鍵字。
  • (2) analyzer:fieldType的子元素,是分詞器,由tokenizer和filter組成。例如
<fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.TurkishLowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" words="lang/stopwords_tr.txt" ignoreCase="false"/>
      <filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>
    </analyzer>
  </fieldType>
複製代碼
  • (3) field:字段,用來建立索引,若是這個字段須要生成索引,則須要設置的indexed爲true,須要存儲設置stored屬性爲true。例如:
<field name="age" type="pint" indexed="true" stored="true"/>
複製代碼

3.2 添加索引字段

  • 方式一:直接修改managed-schema配置文件(不推薦,修改後須要重啓服務),例如:
<field name="age" type="pint" indexed="true" stored="true"/>
複製代碼
  • 方式二:經過solr頁面進行添加。(推薦,不須要重啓服務)

![](_v_images/20190623133627274_22114.png =811x)sql

3.3 配置中文分詞工具

  • 1.下載中文分詞器IKAnalyzer,下載地址,密碼:igt9。
  • 2.解壓壓縮包包,目錄以下:

  • 3.將兩個jar包複製到該路徑下:E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF\lib。
  • 4.另外將三個配置文件複製到該路徑下:E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF\classes。若是沒有classes文件夾就新建一個。
  • 5.在schema中添加分詞器。
<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>
複製代碼
  • 6.在ext.dic文件中添加自定義的中文詞組shell

  • 須要重啓solr數據庫

效果以下: apache

4、導入索引數據(mysql數據爲例)

  • 1.建立mysql數據庫

  • 2.在該路徑下solr_home\server\solr\new_core\conf(E:\solr-8.1.1\server\solr\core_issuer\conf)下新建my-data-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solr_test" user="root" password=""/>
    <document>
        <entity name="user" query="select * from user">
            <field column="id" name="id"/>
            <field column="age" name="age"/>
            <field column="name" name="name"/>
            <field column="hobby" name="hobby"/>
        </entity>
    </document>
</dataConfig>
複製代碼
  • 3.用solr添加數據庫字段對應的索引字段,添加後打開managed-schema文件會看到:
<field name="name" type="string" indexed="true" stored="true"/>
<field name="age" type="pint" indexed="true" stored="true"/>
<field name="hobby" type="string" indexed="true" stored="true"/>
複製代碼

請勿添加id字段,該字段已存在,添加會報錯瀏覽器

  • 4.打開該路徑下文件:solr_home\server\solr\new_core\conf\solrconfig.xml(E:\solr-8.1.1\server\solr\core_issuer\conf\solrconfig.xml),隨便找一個與requestHandler同級節點上添加如下配置。如圖:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
	<lst name="defaults">
		<str name="config">my-data-config.xml</str>
	</lst>
</requestHandler>
複製代碼
  • 5.將solr_home\dist(E:\solr-8.1.1\dist)目錄下的solr-dataimporthandler-8.1.1.jar和MySQL驅動(隨便找個MySQL驅動)複製到solr_home\server\solr-webapp\webapp\WEB-INF\lib(E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF\lib)目錄下。
  • 6.重啓solr服務。
  • 7.打開solr頁面,進行下面操做。

  • 8.檢測數據是否導入成功

若是對索引字段進行中文分詞

添加對索引字段時,fileType :選擇text_ik

效果如圖: 查詢 魯西化工 的結果

5、Java客戶端solrJ的使用

5.1 導入pom

<!--solr -->
<dependency>
	<groupId>org.apache.solr</groupId>
	<artifactId>solr-solrj</artifactId>
	<version>8.1.1</version>
</dependency>
複製代碼

5.2 編寫model

public class User {

    @Field(value = "id")
    private String id;
    @Field(value = "name")
    private String name;
    @Field(value = "age")
    private Integer age;
    @Field(value = "hobby")
    private String hobby;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", hobby=" + hobby +
                '}';
    }
}

複製代碼

5.3 寫測試代碼

public class Main {
    private static final String SOLR_URL = "http://localhost:8888/solr";
    private static final String CORE_NAME = "new_core";
    public static void main(String[] args) throws IOException, SolrServerException {
        HttpSolrClient client = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();
        SolrQuery query = new SolrQuery();
        //設置要查詢的字段
        query.setFields("id","name", "age","hobby");
        //查詢所有
        QueryResponse response = client.query(CORE_NAME,query);
        //查詢結果
        SolrDocumentList results = response.getResults();
        System.out.println("結果總數:" + results.getNumFound());
        //遍歷列表
        System.out.println("文檔結果:");
        for (SolrDocument doc : results) {
            System.out.printf("[id:%s,name:%s,age:%s,hobby:%s]\n", doc.get("id"), doc.get("name"), doc.get("age"), doc.get("hobby"));
        }
        //獲得實體對象
        List<User> userList = response.getBeans(User.class);
        System.out.println("轉爲實體對象:\n"+Arrays.toString(userList.toArray()));
    }
}

複製代碼

**按條件單個查詢: **

//查詢name爲「陳龍」的user
query.set("q","name:陳龍" );
複製代碼

過濾查詢

//查詢name爲「陳龍」的user
query.set("q","name:陳龍" );
複製代碼

6、定時實時重建索引和增量更新

準備工做:

  • 1.下載jar包:solr-dataimportscheduler-1.1.jar (網上也有1.0版本,可是具體對應solr版本請自行查找) 下載地址

** 注意注意注意(重要的事情說三遍):當solr7+以上版本時,該jar包會有問題,配置後服務器啓動會報錯,頁面404,具體詳情後面會有解決方案。**

我的網盤分享:連接:pan.baidu.com/s/1HT9WzXQx… 提取碼:ehju

這個對7+版本能夠正常使用

  • 2.新建文件:dataimport.properties,文件複製下面的就好,具體配置含義已給出註釋:
#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################
 
#  to sync or not to sync
#  1 - active; anything else - inactive
# 這裏的配置不用修改
syncEnabled=1
 
#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
#  修改爲你所使用的core,我這裏是我自定義的core:simple
syncCores=core_issuer
 
#  solr server name or IP address
#  [defaults to localhost if empty]
這個通常都是localhost不會變
server=localhost
 
#  solr server port
#  [defaults to 80 if empty]
#  安裝solr的tomcat端口,若是你使用的是默認的端口,就不用改了,不然改爲本身的端口就行了
port=8983
 
#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
#  這裏默認不改
webapp=solr
 
#  URL params [mandatory]
#  remainder of URL
#  這裏改爲下面的形式,solr同步數據時請求的連接  (我這裏使用的 full-import )
params=/dataimport?command=full-import&clean=true&commit=true
 
#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
#這裏是設置定時任務的,單位是分鐘,也就是多長時間你檢測一次數據同步,根據項目需求修改
#  開始測試的時候爲了方便看到效果,時間能夠設置短一點
interval=1
 
#  重作索引的時間間隔,單位分鐘,默認7200,即5天; 
#  爲空,爲0,或者註釋掉:表示永不重作索引
reBuildIndexInterval=7200
 
#  重作索引的參數
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
 
#  重作索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  兩種格式:2012-04-11 03:10:00 或者  03:10:00,後一種會自動補全日期部分爲服務啓動時的日期
reBuildIndexBeginTime=03:10:00
複製代碼

準備好這一個jar包和dataimport.properties文件,開始下面的步驟……

  • 步驟一:將solr-dataimportscheduler.jar包複製到E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF\lib中。
  • 步驟二:在E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF目錄下的web.xml文件中添加監聽配置(標籤前面):
<listener>
   <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
 </listener>
複製代碼

注意(又一個注意的地方):org.apache.solr.handler.dataimport.scheduler.ApplicationListener 後面不能有空格,不然可能會報錯,且很難發現問題緣由。

  • 步驟三:在\solrhome目錄下新建一個conf文件夾(與simple文件夾同目錄),將dataimport.properties文件放在conf文件夾中。
  • 步驟四:重啓tomcat,訪問Solr。

7、刪除索引庫(刪除全部數據)的兩種方法

  • 1.刪除索引庫全部數據的方法一:直接用solr可視化界面刪除

  • 2.刪除索引庫全部數據的方法二:利用solrClient的方法刪除全部數據
@Test
    public void deleteAll(){
        try {
            searchCrawlerProductService.deleteAll();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
複製代碼
public RestResult deleteAll(){
        try {
            log.debug("刪除全部索引");
 
            solrClient.deleteByQuery("*:*");  //把刪除的條件設置爲"*:*"就能夠了
            solrClient.commit();
 
            log.debug("所有刪除成功");
        } catch (Exception e) {
            log.debug("刪除所有索引失敗");
 
            e.printStackTrace();
        }
 
        return RestResult.success("刪除索引庫成功");
    }
複製代碼
相關文章
相關標籤/搜索