前言
在使用傳統數據庫(例如Mysql)做模糊查詢的時候,相信有經驗的朋友都知道,如果使用%content%
的方式進行模糊查詢,一旦數據量變大,搜索速度會變得很慢,此時可能大家都會想到用索引來解決這個問題。
但是,這種模糊查詢的方式會走索引麼?答案顯然是否定的,因爲索引有個原則 “最左匹配原則”,而%
是不會走索引的,因此該sql語句執行之後會全表掃描,這種方式顯然是不可取的… 但有什麼辦法,既可以滿足模糊查詢(%content%
的形式),又可以增加查詢效率呢?
答案就是Solr!
什麼是Solr
我們先來看看度娘上是怎麼介紹Solr的。
Solr是一個高性能,採用Java開發基於Lucene的全文搜索服務器。同時對其進行了擴展,提供了比Lucene更爲豐富的查詢語言,同時實現了可配置、可擴展並對查詢性能進行了優化,並且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎。Solr是基於Apache Lucene ™構建的流行,快速,開源的企業搜索平臺。它並不是apache的頂級項目,而是lucene一個子項目而已
用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件或者Json格式字符串,生成索引,也可以通過http get操作提出查找請求,並得到XML或者Json格式的返回結果。而XML文件和Json本質上都是由字符串構成的,因此Solr具有天然的跨平臺特性。
什麼是Lucene
剛纔提到說Solr是採用Java開發基於Lucene的全文搜索服務器,那麼Lucene又是何方神聖呢?
Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工
具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索
引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個
簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎建立起完整的全文
檢索引擎。Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。
Lucene提供了一個簡單卻強大的應用程式接口,能夠做全文索引和搜尋。在Java開發環境裏Lucene是
一個成熟的免費開源工具。就其本身而言,Lucene是當前以及最近幾年最受歡迎的免費Java信息檢索程
序庫。人們經常提到信息檢索程序庫,雖然與搜索引擎有關,但不應該將信息檢索程序庫與搜索引擎相 混淆。
說白了,Lucene就是一個用來實現搜索功能的庫,它內置了大量的算法,在搜索使用這個算法,能加快檢索速度。這種感覺就像是C++和Python,大家應該都知道現如今很火爆的人工智能基本上都是由Python撰寫的,但是人工智能的很多算法並不是由Python編寫的,而是C++,Lucene其實也就是算法庫,儲存了大量的檢索算法,而Solr就是面向企業應用的獨立的應用程序,Lucene更偏向於底層。
Solr 和 Lucene 的區別
Solr和Lucene的本質區別有以下三點:
Lucene | Solr |
---|---|
本質上是搜索庫 | 是獨立的應用程序 |
專注於搜索底層的建設 | 專注於企業應用 |
不負責支撐搜索服務所必須的管理 | 負責支撐搜索服務所必須的管理 |
因此,Solr可以算是是Lucene面向企業搜索應用的擴展
Solr的安裝
介紹了這麼多,其實Solr就是一個專業的搜索服務器 Solr Download
配置java環境變量
下載請戳 Linux JDK Download ,記得下載後綴爲tar.gz
的包哦!
第一步:下載linux版本JDK
第二步:使用XFTP傳到Linux並解壓
接着我們在Linux下的下創建/download
目錄,並藉助XFTP將文件傳到此目錄
然後使用以下指令將文件解壓到usr/local/java
tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/local/java/
第三步:配置環境變量
通過vi /etc/profile
指令在最後添加以下配置,這裏的JAVA_HOME
和Window是一樣的,也就是jdk中存放bin(可執行文件)子目錄的根路徑,下面的寫法就是固定的了。
JAVA_HOME=/usr/local/java/jdk1.8.0_181
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
注意配置完成之後要使用source /etc/profile
刷新/etc/profile
配置文件
第五步:測試
輸入java -version
,測試,如果jdk安裝配置成功之後,會得到如下結果
安裝Solr
第一步:下載Solr的壓縮包
這裏我就直接使用wget啦!大家也可以點擊 Solr Download 下載,使用Xftp將文件導入到Linux文件夾中
#創建solr文件夾
mkdir /usr/local/solr
cd /usr/local/solr
#下載solr至該文件夾中
wget http://mirror.bit.edu.cn/apache/lucene/solr/7.7.2/solr-7.7.2.tgz
第二步:解壓Solr壓縮包
tar -zxvf solr-7.7.2.tgz
解壓完成之後的目錄分析如下
目錄名稱 | 解釋 |
---|---|
Bin | 可執行腳本 |
Contrib | 給Solr額外添加功能的 |
Dist | Solr的依賴包 |
Docs | 文檔 |
Server | Solr 服務器的目錄 |
第三步:Solr的啓動和關閉
Solr的啓停命令很簡單,./solr start
爲啓動,./solr stop
爲停止,./solr restart
爲重啓。注意了,在root 用戶裏面,solr 要啓動必須添加 -force
。
[root@localhost bin]# ./solr start -force
*** [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 3795.
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
NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 8983.
Started Solr server on port 8983 (pid=7661). Happy searching!
第四步:測試
不難發現 “我愛中國” 被拆分成了4個詞?但是這樣分詞並檢索沒有一點意義
大家可以點擊Analyse Fieldname / FieldType
,並沒有找到text.cn
(中文分詞器)?是不是很坑?
第五步:配置ik 分詞器(最好的中文分詞器)
咱們先準備ik的資源,分詞器下載請戳 IK Download
下載好之後,使用Xftp將ik包中的下面兩個jar包放入solr-wepapp/webapp/WEB-INF/lib
中
第六步:配置擴展,停詞
接着我們新建一個classes文件夾(代表java 編譯後的jar ,或者需要的xml文件)
使用Xftp將ik包中剩餘的三個文件放入新建好的classes文件夾中
接着通過cd /usr/local/solr7/solr-7.7.2/server/solr/{ego:庫的名稱}/conf
指令進入修改配置文件的目錄中,並找到配置文件managed-schema
,新增text_cn
字段類型
[root@localhost conf]# cd /usr/local/solr/solr-7.7.2/server/solr/marco/conf/
[root@localhost conf]# ll
總用量 132
drwxr-xr-x. 2 root root 4096 9月 9 12:48 lang
-rw-r--r--. 1 root root 54513 5月 17 06:55 managed-schema
-rw-r--r--. 1 root root 308 5月 17 06:48 params.json
-rw-r--r--. 1 root root 873 5月 17 06:48 protwords.txt
-rw-r--r--. 1 root root 53986 5月 17 06:55 solrconfig.xml
-rw-r--r--. 1 root root 781 5月 17 06:48 stopwords.txt
-rw-r--r--. 1 root root 1124 5月 17 06:48 synonyms.txt
使用vim managed-schema
指令修改配置文件,加入以下ik的中文配置
<!-- Chinese -->
<dynamicField name="*_txt_cn" type="text_cn" indexed="true" stored="true"/>
<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/>
</analyzer>
</fieldType>
第七步:重啓solr
執行./solr restart -force
重啓Solr
此時,我們搜索text_cn
就可以搜索到中文分詞啦!
再來執行分詞,發現 “我愛中國” 被拆分爲 “愛” 和 “中國” 了!