搜索引擎Solr介紹
1、直接使用sql搜索存在的問題
大多數(shù)搜索引擎應(yīng)用都必須具有某種搜索功能 搜索功能往往是巨大的資源消耗 它們由于沉重的數(shù)據(jù)庫加載而拖垮你的應(yīng)用的性能 所有我們一般在做搜索的時候 會把它單獨轉(zhuǎn)移到一個外部的搜索服務(wù)器當(dāng)中進行 Apache Solr是一個流行的開源搜索服務(wù)器
2、Apache Solr
Solr是一個開源搜索平臺,用于構(gòu)建搜索應(yīng)用程序。 是一個獨立的企業(yè)級搜索應(yīng)用服務(wù)器,它對外提供類似于Web-service的API接口 它建立在Lucene(全文搜索引擎)之上。 Solr是企業(yè)級的,快速的和高度可擴展的。 用戶可以通過http請求,向搜索引擎服務(wù)器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結(jié)果。
3、為什么選擇Solr ?
第一點原因:來自SQL數(shù)據(jù)庫在性能上缺乏亮點?;旧?,你需要在你的查詢中使用JOIN操作。 第二點原因是文檔的天然數(shù)據(jù)特性松散的文本文件,這種查詢都是需要使用LIKE。然而joins和likes都是性能殺手,在目前的數(shù)據(jù)庫引擎中是不方便的。 solr底層采用的是倒排索引。這種數(shù)據(jù)結(jié)構(gòu)類似與美化過的詞典
4、Solr 關(guān)鍵特性
1.基于標(biāo)準(zhǔn)的開放接口:Solr搜索服務(wù)器支持通過XML、JSON和HTTP查詢和獲取結(jié)果。 2.易管理:Solr可以通過HTML頁面管理,Solr配置通過XML完成。 3.可伸縮性:能夠有效地復(fù)制到另外一個Solr搜索服務(wù)器。 4.靈活的插件體系:新功能能夠以插件的形式方便的添加到Solr服務(wù)器上。 5.強大的數(shù)據(jù)導(dǎo)入功能:數(shù)據(jù)庫和其他結(jié)構(gòu)化數(shù)據(jù)源現(xiàn)在都可以導(dǎo)入、映射和轉(zhuǎn)化。
5、Solr安裝
5.1、上傳安裝包

5.2、對以上內(nèi)容進行解壓
解壓tomcat
tar -zxvf apache-tomcat-8.5.32.tar.gz
mv apache-tomcat-8.5.32 tomcat
解壓solr
tar -zxvf solr-4.10.3.tar
解壓IK
unzip IKAnalyzer.zip

5.2、復(fù)制solr.war到tomcat/webapp下
cd /usr/local/solr/solr-4.10.3/example/webapps/
cp solr.war /usr/local/solr/tomcat/webapps/

5.3、啟動tomcat讓solr.war自動解壓
/usr/local/solr/tomcat/bin/startup.sh
5.4、關(guān)閉tomcat
/usr/local/solr/tomcat/bin/shutdown.sh
5.5、進入到webapps刪除solr.war包
cd /usr/local/solr/tomcat/webapps/
rm -rf solr.war
5.6、將solr-4.10.3/example/lib/ext/目錄下的所有jar包拷貝到/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib目錄中
cd /usr/local/solr/solr-4.10.3/example/lib/ext
cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib
5.7、將solr-4.10.3/example/目錄下的solr文件夾復(fù)制到/usr/local/solr/目錄下并且重命名為solrhome
cd /usr/local/solr/solr-4.10.3/example/
cp -r solr /usr/local/solr/
cd /usr/local/solr mv solr solrhome
5.8、配置tomcat/webapps/solr/WEB-INF/web.xml家的位置
cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
vim web.xml
添加solrhome

6、域的分類
域的配置文件 cd /usr/local/solr/solrhome/collection1/conf/ vim schema.xml
6.1、什么是域
域相當(dāng)于數(shù)據(jù)庫的表字段,用戶存放數(shù)據(jù)用戶根據(jù)業(yè)務(wù)需要去定義相關(guān)的Field(域)
6.2、域的分類:
field普通域 大多數(shù)情況都可以用這個域來完成, 主要定義了域名和域的類型.
copyField復(fù)制域 復(fù)制域中有source叫做源域, dest代表目標(biāo)域, 在維護數(shù)據(jù)的時候, 源域中的內(nèi)容會復(fù)制到目標(biāo)域中一份, 從目標(biāo)域中搜索, 就相當(dāng)于從多個源域中搜索一樣
dynamicField動態(tài)域 solr中域名要先定義后使用, 沒有定義就使用會報錯, 如果沒有定義的域名想使用可以模糊匹配動態(tài)域, 讓沒有定義的域名可以使用.
uniqueKey主鍵域 在添加數(shù)據(jù)的時候必須有主鍵域, 沒有會報錯, 這個不用添加也不用修改, 就使用這個默認(rèn)的域名id就可以.
6.3、域的常用屬性
name:指定域的名稱type:指定域的類型indexed:是否索引stored:是否存儲required:是否必須multiValued:是否多值
想要往solr存儲數(shù)據(jù),就把相關(guān)字段寫進域中
6.4、普通域
<field name="item_goodsid" type="long" indexed="true" stored="true"/>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="double" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category" type="string" indexed="true" stored="true" />
<field name="item_seller" type="text_ik" indexed="true" stored="true" />
<field name="item_brand" type="string" indexed="true" stored="true" />
<field name="item_updatetime" type="date" indexed="true" stored="true" />
6.5、復(fù)制域
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_category" dest="item_keywords"/>
<copyField source="item_seller" dest="item_keywords"/>
<copyField source="item_brand" dest="item_keywords"/>
6.6、動態(tài)域
<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />
7、solrj
概述
solrJ是solr官方推出的客戶端工具包, 將solrj的jar包放到我們項目中, 我們調(diào)用solrj中的api來遠(yuǎn)程給solr服務(wù)器發(fā)送命令, solr服務(wù)器就可以完成對索引庫的操作(添加修改刪除查詢)
操作步驟
創(chuàng)建一個普通的Java工程
添加soloJ相關(guān)Jar包

操作
添加或者修改 修改時, 會把以前的內(nèi)容刪除, 然后再添加

public class test {
? ?@Test
? ?public void testIndexCreateAndUpdate() throws Exception {
? ? ? ?/**
? ? ? ? * 創(chuàng)建和solr服務(wù)器連接
? ? ? ? * http://192.168.0.108:8080/solr是連接的默認(rèn)實例也就是collection1實例
? ? ? ? * http://192.168.0.108:8080/solr/collection2實例
? ? ? ? */
? ? ? ?SolrServer solrServer = new HttpSolrServer("http://192.168.0.108:8080/solr");
? ? ? ?//創(chuàng)建文檔對象
? ? ? ?SolrInputDocument doc = new SolrInputDocument();
? ? ? ?doc.addField("id", "002");
? ? ? ?doc.addField("title", "后裔");
? ? ? ?doc.addField("price", "250");
? ? ? ?//添加或者修改
? ? ? ?solrServer.add(doc);
? ? ? ?//提交
? ? ? ?solrServer.commit();
? ?}
}
查詢所有

@Test
? ?public void testIndexSearch() throws Exception {
? ? ? ?SolrServer solrServer = new HttpSolrServer("http://192.168.0.108:8080/solr");
? ? ? ?//創(chuàng)建查詢對象
? ? ? ?SolrQuery query = new SolrQuery();
? ? ? ?//設(shè)置查詢條件
? ? ? ?query.setQuery("*:*");
? ? ? ?//查詢并返回響應(yīng)
? ? ? ?QueryResponse queryResponse = solrServer.query(query);
? ? ? ?//從響應(yīng)中獲取結(jié)果集
? ? ? ?SolrDocumentList results = queryResponse.getResults();
? ? ? ?System.out.println("count=" + results.getNumFound());
? ? ? ?for (SolrDocument result : results) {
? ? ? ? ? ?System.out.println("id=" + result.get("id"));
? ? ? ? ? ?System.out.println("title=" + result.get("title"));
? ? ? ?}
? ?}
刪除

@Test
? ?public void testIndexDelete() throws Exception {
? ? ? ?SolrServer solrServer = new HttpSolrServer("http://192.168.0.108:8080/solr");
? ? ? ?//單個刪除
? ? ? ?//solrServer.deleteById("001");
? ? ? ?//刪除所有
? ? ? ?solrServer.deleteByQuery("*:*");
? ? ? ?//提交
? ? ? ?solrServer.commit();
? ?}
8、中文分詞器
IK Analyzer簡介
IK Analyzer 是一個開源的,基亍 java 語言開發(fā)的輕量級的中文分詞工具包。它是以開源項目Luence 為應(yīng)用主體的,結(jié)合詞典分詞和文法分析算法的中文分詞組件IK 實現(xiàn)了簡單的分詞歧義排除算法,標(biāo)志著 IK 分詞器從單純的詞典分詞向模擬語義分詞衍化。作用: 有中文語義分析的效果, 對中文分詞效果好.
安裝
8.1、把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目錄下
cd /usr/local/solr/IKAnalyzer/
cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
8.2、創(chuàng)建WEB-INF/classes文件夾
cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
mkdir classes
8.3、把擴展詞典、停用詞詞典、配置文件放到 solr 工程的 WEB-INF/classes 目錄下
cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
cp /usr/local/solr/IKAnalyzer/IKAnalyzer.cfg.xml ./
cp /usr/local/solr/IKAnalyzer/ext_stopword.dic ./
mv ext_stopword.dic stopword.dic
8.4、修改IKAnalyzer.cfg.xml配置文件

http://blog.csdnimg.cn/20200808150618399.png)
stopword.dic已經(jīng)有了,ext.dic還沒有
創(chuàng)建ext.dic:touch ext.dic
stopword.dic-停止詞典
切分詞的時候, 凡是出現(xiàn)在停止詞典中的詞都會被過濾掉.
ext.dic-擴展詞典
凡是專有名詞都會放到這里, 如果自然語義中不是一個詞, 放到這里后solr
切分詞的時候就會切分成一個詞.
8.5、配置分詞器
修改 Solrhome 的 schema.xml 文件
cd /usr/local/solr/solrhome/collection1/conf
vim schema.xml
在最后添加
<fieldType name="text_ik" class="solr.TextField">
?<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
自定義域名使用自己創(chuàng)建的分詞器
<field name="content_ik" type="text_ik" indexed="true" stored="true"/>

9、測試:
配置完畢后重啟tomcat

測試成功!