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從安裝,到配置以及最終的到調用,都呈現出來了。
有什麼問題歡迎一起探討。
最後,再打個小廣告吧,關注我的公衆號,可以隨時留言聯繫。