Solr7.5 入門 安裝、配置、調用實踐 頂 原

Solr是一個獨立的企業級搜索應用服務器,官網地址:https://lucene.apache.org/solr/

從域名我們不難看出,solr是基於lucene的,同時屬於apache旗下的組件,今天我們一起學習瞭解一下solr7.5的安裝、使用和java基礎調用。

一、下載

進入官網下載頁:http://www.apache.org/dyn/closer.lua/lucene/solr/7.5.0

直接下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.5.0/

目前最新版本7.5,我們就以這個爲安裝實例。

下載之後,我們得到一個安裝包solr-7.5.0.zip,本示例以windows爲例。

二、安裝

1.把solr-7.5.0.zip安裝文件解壓到指定目錄

我們可以看到是這樣一個目錄結構:

bin:啓動命令

dist:jar包

example:示例

server:solr的服務相關配置

7.5的solr是自帶jetty容器的,我們都不需要tomcat,直接用自帶的jetty即可

當然如果你有更多定製化需求,也可以用tomcat做容器。

三、啓動

解壓了我們就可以直接通過/solr-7.5.0/bin 下的solr進行啓動了。

在window下我一般是通過cmd來啓動。

打開cmd,進入到對應的bin目錄下,執行:

solr start

當你看到如下提示,表示啓動成功:

此時我們就可以通過http://127.0.0.1:8983/solr/#/ 訪問solr的管理界面了。

是不是覺得太簡單了,是的沒有比這更簡單的了。

但是此時高興還爲時過早。

三、配置

配置主Core

初始化的sorl服務是沒有core的,我們需要新建一個。

點擊Core Admin,進入以下界面:

默認界面如下,定義你的core名稱,點擊Add core。

會報一個錯誤:

 

莫要驚慌,此時我們去安裝目錄(F:\solr\solr-7.5.0\server\solr)下,可以看到已經新建了一個core目錄。

 

報錯是因爲需要的配置文件不存在,我們去拷貝過來即可。

進入F:\solr\solr-7.5.0\server\solr\configsets\_default 目錄下,把conf文件夾copy到

F:\solr\solr-7.5.0\server\solr\new_core 目錄下,然後再執行Add core。

然後等待1-2s,會進入以下界面:

此時說明我們的core已經創建成功。

選擇新建的core,我們就進入到solr的主要管理界面了。

到此,我們已經成功的搭建好了solr的基本服務。

四、數據庫配置

完成以上步驟,我們經歷了一個solr服務的從0到有,但是實際上,我們大部分情況下是需要連接數據庫來對數據進行索引,然後極大提升我們的查詢效率。

如何通過solr連接數據庫,把數據索引到solr服務中,我們接着說。

 

1.JAR包準備

1.1 準備mysql連接驅動包,mysql-connector-java-5.1.29.jar,直接maven私服下載或者從自己的項目中獲取,這個使用率應該是特別高的。

2.1 找到solr-dataimporthandler-7.5.0.jar和solr-dataimporthandler-extras-7.5.0.jar 。這2個jar在solr安裝目錄下有,F:\solr\solr-7.5.0\dist

把這3個jar包複製到F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目錄下,熟悉java的朋友其實看一眼就明白,這其實是一個標準的web項目目錄。

2.配置文件準備

進入安裝目錄,F:\solr\solr-7.5.0\example\example-DIH\solr\db,

複製目錄下conf文件夾到F:\solr\solr-7.5.0\server\solr\new_core,覆蓋之前的目錄.

說明其實創建core的時候,我們就複製過一次,其實大家可以一步到位,第一次就複製F:\solr\solr-7.5.0\example\example-DIH\solr\db的conf文件夾

在conf目錄下,我們可以看到很多配置文件如下:

2.1 修改db-data-config.xml

初始化的配置文件如下,這是一個數據庫連接池的配置文件,我們需要配置自己的數據庫地址和查詢sql。

<dataConfig>
    <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:${solr.install.dir}/example/example-DIH/hsqldb/ex" user="sa" />
    <document>
        <entity name="item" query="select * from item"
                deltaQuery="select id from item where last_modified > '${dataimporter.last_index_time}'">
            <field column="NAME" name="name" />

            <entity name="feature"  
                    query="select DESCRIPTION from FEATURE where ITEM_ID='${item.ID}'"
                    deltaQuery="select ITEM_ID from FEATURE where last_modified > '${dataimporter.last_index_time}'"
                    parentDeltaQuery="select ID from item where ID=${feature.ITEM_ID}">
                <field name="features" column="DESCRIPTION" />
            </entity>
            
            <entity name="item_category"
                    query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'"
                    deltaQuery="select ITEM_ID, CATEGORY_ID from item_category where last_modified > '${dataimporter.last_index_time}'"
                    parentDeltaQuery="select ID from item where ID=${item_category.ITEM_ID}">
                <entity name="category"
                        query="select DESCRIPTION from category where ID = '${item_category.CATEGORY_ID}'"
                        deltaQuery="select ID from category where last_modified > '${dataimporter.last_index_time}'"
                        parentDeltaQuery="select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}">
                    <field column="DESCRIPTION" name="cat" />
                </entity>
            </entity>
        </entity>
    </document>
</dataConfig>

以本地Mysql數據庫爲例,修改配置文件如下:

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/solrtest?charactorEncoding=utf-8" user="root" password="root" />
    <document>
        <entity name="student" query="select * from student" pk="id">
            <field column="id" name="id" />
			<field column="name" name="name" />
			<field column="code" name="code" />
			<field column="create_time" name="createTime" />
        </entity>
    </document>
</dataConfig>

配置說明:

dataSource-->數據庫連接,用戶名密碼配置

entity-->sql定義

field-->字段定義,column對應數據庫字段,name對應solr的索引字段名

本地數據庫如下:

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `code` varchar(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

2.2 修改managed-schema

進入該配置文件,這個配置文件主要用於配置索引字段。我們在配置文件中增加field,要求一一對應。

    <field name="id" required="true" type="string" indexed="true" stored="true"/>
	<field name="name" type="string" indexed="true" stored="true"/>
	<field name="code" type="string" indexed="false" stored="true"/>
	<field name="createTime" type="pdate" indexed="false" stored="true"/>

注意:我們copy來的配置文件中有一些關鍵字已經配置了,如id,name,那就不需要重新配置field,只需要配置沒有的。

如果你的表主鍵id不是叫id,那麼你定義的field需要指定required="true",並把默認的id的required="true"屬性去掉,

並把<uniqueKey>id</uniqueKey>修改成你的主鍵id值,否則數據導入不進去。

說明:因爲只是做個基礎的搜索業務,沒有精細該schema文件,精益求精的小夥伴可以把冗餘字段都幹掉試試。

到此,配置完成,接下來我們操作導入數據。

五、數據導入

以上配置完成後,需要重啓solr服務。

打開cmd,進入到對應的bin目錄下,執行:solr stop -p 8983

服務停止後,我們再執行啓動命令:solr start

1.數據導入

啓動成功後進入http://127.0.0.1:8983/solr/#/new_core/dataimport//dataimport

或者在主界面點擊Dataimport

點擊Entity,我們發現有我們配置的student,勾選中

最後勾選Auto-Refresh Status,點擊Excute,

右邊會顯示執行結果,如圖所示,導入了4條數據。

進入到Query菜單,執行查詢,如圖所示,結果如下:

和我們數據庫的數據是剛好對應的。

說明:solr中的索引字段名取決於你在managed-schema中如何配置定義。

另外,大家配置的時候注意,不需要進行索引或者存儲的字段要配置成false,節省資源空間。

<field name="createTime" type="pdate" indexed="false" stored="true"/>

如創建時間,我們不需要進行查詢索引,indexed配置成false即可。

2.數據清空

進入solr主頁,進入Documents模塊,如圖所示,選擇XML類型

輸入xml

<delete><query>*:*</query></delete><commit/>

點擊Submit Document,結果如下:

此時再去查詢,就看到數據都已經清空。

六、增量更新索引

大家發現沒,solr是"一步一個坑",弄完這個,你又得弄另外一個。

我們有了數據導入,那數據庫變化了怎麼同步數據?難道每次手動點一點?

答案當然是NO,所以接下來,我們一起了解下如何配置增量更新索引。

增量更新索引,顧名思義就是在原有的數據基礎上進行索引更新,不會對已有的數據再進行一次索引。

1.準備JAR包

這個jar包挺坑的,蒐羅了很久,最終也是花積分下載的,本着"天下沒有免費的JAR包"的原則,所以大家如果需要該jar包,

請關注微信公衆號:

發送"solr"關鍵字獲取百度網盤的下載鏈接吧(不要打我,爲了讓你成爲我的粉絲,我什麼都能做)。

下載了jar包後,把jar包複製放到F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目錄下

2.修改web.xml配置

F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF

打開web.xml文件,增加監聽器配置

<listener>
	 <listener-class>
	    org.apache.solr.handler.dataimport.scheduler.ApplicationListener
	 </listener-class>
   </listener>

這個監聽器源碼就是來自上面的jar包中,我確認過了。

3.增加dataimport.properties配置

增加增量導入配置文件,注意,目錄!目錄!目錄!

這個文件在F:\solr\solr-7.5.0\server\solr\new_core\conf  有一個,但是,我們不是配置到這裏!敲黑板,劃重點!

我們需要在F:\solr\solr-7.5.0\server\solr 目錄下,新建一個conf文件夾,注意啦,這個文件夾是我們手動新建的,如果沒操作這一步,你就是操作不當。

然後在conf目錄下,新建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
syncCores=my_core

#  solr server name or IP address
#  [defaults to localhost if empty]
server=localhost

#  solr server port
#  [defaults to 80 if empty]
#  安裝solr的端口
port=8983

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
#  這裏改成下面的形式,solr同步數據時請求的鏈接
params=/dataimport?command=delta-import&clean=false&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 01:00:00 或者  01:00:00,後一種會自動補全日期部分爲服務啓動時的日期
reBuildIndexBeginTime=01:00:00

這個文件說的挺詳細的,建議存檔理解。因爲運行一次之後,這個文件會變成醬紫了,but,我們並不需要care了

4.修改db-data-config.xml配置

總算來到"終極BOSS關",我們只需要再配置2個腳本,就KO了,再堅持一下吧。

直接上配置代碼吧,簡單粗暴一點。

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/solrtest?charactorEncoding=utf-8" user="root" password="root" />
    <document>
        <entity name="student" query="select * from student"
			deltaImportQuery="select * from student where id='${dataimporter.delta.id}'"
			deltaQuery="select * from student where `create_time` > '${dataimporter.last_index_time}'" pk="id">
            <field column="id" name="id" />
			<field column="name" name="name" />
			<field column="code" name="code" />
			<field column="create_time" name="createTime" />
        </entity>
    </document>
</dataConfig>

說明:

主要增加了deltaImportQuery和deltaQuery 2個屬性,其實這個就是作爲增量時的操作sql,solr默認讀取這個key值的sql語句。

${dataimporter.delta.id}  這個東東,我沒找到具體的定義在哪,但是如果你的主鍵id配置的不叫id,如叫studentId,那麼,這個取變量就應該寫成${dataimporter.delta.studentId}

${dataimporter.last_index_time}  固定寫法,更新的判斷條件,上一次的修改時間需要大於上一次索引的更新時間。

這個參數會自動更新在F:\solr\solr-7.5.0\server\solr\new_core\conf 下的dataimport.properties文件中

這個文件長這樣,瞭解一下:

(沒錯,和前面配置的那個是同名文件,我也不太理解爲啥不能共用這一個)

5.重啓驗證

嗷嗷嗷,總算配置完成,那麼趕緊重啓一波,驗證一把唄。

驗證步驟1:重啓完服務後,觀察solr日誌

驗證步驟2:去數據庫中新建或者修改數據,靜靜等待你配置的增量時間

數據庫修改數據:

等待.........

驗證步驟3:查詢結果,觀察數據是否已經同步

當你看到出現出現如下日誌:(日誌目錄-->F:\solr\solr-7.5.0\server\logs\solr.log)

2018-10-22 10:05:18.234 INFO  (Thread-17) [   ] o.a.s.h.d.DataImporter Starting Delta Import
2018-10-22 10:05:18.235 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Response message                      OK
2018-10-22 10:05:18.235 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Response code                 200
2018-10-22 10:05:18.235 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Disconnected from server              localhost
2018-10-22 10:05:18.236 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Process ended at ................ 22.10.2018 10:05:18 235

說明增量同步已經執行...

查詢solr:

至此,增量同步配置完成!

七、分詞技術

分詞技術說難不難,說簡單吧,感覺有時候又達不到你的需求。

分詞我研究的很膚淺,包括權重這塊,我都沒有太深入,採取的基本配置。

分詞,我用的是IK分詞器,這個jar包很久沒人維護了,索性,在solr7中也是適用的。

1.下載IK分詞器jar包

這裏也方便大家下載,在我的公號(tanjava)中回覆"分詞"即可獲得分詞jar包的百度網盤下載鏈接。

下載解壓後,把ik-analyzer-solr5-5.x.jar 放到F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目錄下。

2.修改managed-schema文件

修改F:\solr\solr-7.5.0\server\solr\new_core\conf 目錄下的managed-schema 文件。

增加分詞器的fieldType定義:

    <fieldType name="text_ik" class="solr.TextField">
		<analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
		<analyzer type="query" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
	</fieldType>

name="text_ik",分詞器名稱,在後面的filed定義的時候,可以直接引用。

如,type定義爲"text_ik",則代表該字段將進行分詞索引

<field name="studentName" type="text_ik" indexed="true" stored="true"/>

3.查看

進入solr主頁,進入Analysis,輸入一段漢字,選擇text_ik,點擊分析可以看到如下結果:

如上,說明分詞成功。

八、小結

至此,solr服務就全部搭建完成了。

簡單回顧一下。

下載安裝文件->配置solr->啓動。

其實關鍵在於配置環節,其實個人覺得配置這塊如果能界面化,相信solr更容易上手了。

 

九、Java調用接口

solr服務搭建完成,那麼如何提供出接口請求訪問?

solr有提供java的api,說透了也很簡單了。

1.引入pom依賴

<dependency>
    <groupId>org.apache.solr</groupId>
	<artifactId>solr-solrj</artifactId>
	<version>7.5.0</version>
</dependency>

2.寫一個solr的工具類

以下是核心方法,從solr查詢的數據都會封裝在SolrDocumentList返回。

public void solrQuery() throws IOException, SolrServerException {
        String solrUrl = "http://127.0.0.1:8983/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();
        // 創建搜索對象
        SolrQuery query = new SolrQuery();
        // 設置搜索條件
        query.set("q","name:張三是好人");
        // 分頁參數
        query.setStart(0);
		// 設置每頁顯示多少條
		query.setRows(10);
        //發起搜索請求
        QueryResponse response = solrClient.query(query);
        // 查詢結果
        SolrDocumentList docs = response.getResults();
        // 查詢結果總數
        long count= docs.getNumFound();
        System.out.println("總條數爲"+count+"條");
        for (SolrDocument doc : docs) {
          System.out.println("id:"+ doc.get("id") + ",name:"+ doc.get("name") + ",uuid:"+ doc.get("uuid"));
        }
        solrClient.close();
    }

 

OK,到此,我們的solr從安裝,到配置以及最終的到調用,都呈現出來了。

有什麼問題歡迎一起探討。

最後,再打個小廣告吧,關注我的公衆號,可以隨時留言聯繫。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章