Solr單機版簡介和安裝以及Spring boot整合使用
目錄
一、簡單介紹solr
二、solr安裝
三、分析器安裝
四、全量匯入、增量匯入
五、java 整合客戶端
六、docker部署。
一:Solr簡介
1、Solr它是一種開放原始碼的、基於 Lucene Java(lucene是一個做搜尋用的類庫,是一套資訊檢索工具包。 nutch和solr都是基於lucene的) 的搜尋伺服器,易於加入到 Web 應用程式中。
2、Solr 提供了層面搜尋、命中醒目顯示並且支援多種輸入輸出格式(包括XML/XSLT 和JSON等格式)。它易於安裝和配置,而且附帶了一個基於 HTTP 的管理介面。Solr已經在眾多大型的網站中使用,較為成熟和穩定。
3、Solr 包裝並擴充套件了 Lucene,所以Solr的基本上沿用了Lucene的相關術語。更重要的是,Solr 建立的索引與 Lucene 搜尋引擎庫完全相容。
4、通過對Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使用構建到其他 Lucene 應用程式中的索引。
5、此外,很多 Lucene 工具(如Nutch)也可以使用Solr 建立的索引。可以使用 Solr 的表現優異的基本搜尋功能,也可以對它進行擴充套件從而滿足企業的需要。
總結:我們可以看出 solr 和 Lucene 並不是一個競爭的關係,solr是基於Lucene 做的一個搜尋引擎伺服器。我們可以把Lucene 看成是一個底層的搜尋api,甚至可以說看成是SDK。而Solr是一個有HTTP介面的基於Lucene的查詢伺服器,封裝了很多Lucene細節並且提供了層面搜尋、命中醒目顯示並且支援多種輸入輸出格式(包括XML/XSLT 和JSON等格式)。它易於安裝和配置,而且附帶了一個基於 HTTP 的管理介面。
二:Solr版本的選擇,4.X如何選擇?
自從2013年開始,solr一改風格,成為了又一個版本帝,一月一個甚至一月倆個版本,使用者如何選擇就成了一個難題。
如此多的版本並不好選擇,並且還有非常多的問題(偶數版本都有問題,不能使用),所以總結記錄下:
4.0 開始引入solrcloud的概念
4.1 啟用了lucene4.1預設的編碼器儲存領域壓縮在預設情況下,壓縮比第一次出現了負增長
4.2 有bug,不能線上使用
4.3.1 可以線上使用
4.4 有bug,不能線上使用
4.5.1 可以線上使用 (例:YY使用的solr4.5.1)
4.6 有bug,不能線上使用
4.7.1 可以線上使用 (例:56視訊使用的solr4.7.1)不過因為4.8改變了舊的配置方式,如果出現問題將沒有版本的繼續優化,所以4.7.1成了一個紀念版本
4.8 有bug,不能線上使用
4.9 有bug,不能線上使用
總結:
solr4.3.1,solr4.5.1,solr4.7.1都可以線上使用,如果資料量要求不高,solr3.6也可以使用
從5.0開始,solr不再以war包釋出(war包可以部署到任何servlet容器中),而是以獨立的java伺服器程式的形式釋出(基於內嵌的jetty),它有啟動/停止指令碼,後續版本不支援部署到其他的servlet容器上(如tomcat)。
參考:http://blog.csdn.net/ningzuobei/article/details/53010156
準備工作:
下載tomcat 8: http://tomcat.apache.org/download-80.cgi
下載Solr4.7.1:http://archive.apache.org/dist/lucene/solr/
分析器:
下載IKAnalyzer:http://download.csdn.net/download/z3225167/10223827
下載pinyinAnalyzer4.3.1:http://download.csdn.net/download/mackywuqiong/8425141
下載pinyinAnalyzer:http://download.csdn.net/download/z3225167/10223901
下載pinyin4j-2.5.0.jar:
資料匯入:
下載mysql對應版本驅動包:http://download.csdn.net/download/small_lee/9947703
tomcat配置
1、修改tomcat的conf目錄下的server.xml,在
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置裡任意位置增加URIEncoding="UTF-8"
2、修改tomcat埠,避免和其他應用服務的埠發生衝突。
3、設定tomcat啟動jvm記憶體。
4、將 solr-4.7.1\example\lib\ext下的所有jar檔案複製到tomcat\lib下。
注:不然會報404頁面找不到
二、Solr配置
1、將下載的 solr-4.7.1.zip 解壓 ,將solr-4.7.1\dist\solr-4.7.1.war檔案複製到tomcat的webapps目錄下,並將檔案命名為solr.war。
注:war是一個完整的web應用程式,包括了solr的jar檔案和所有執行Solr所依賴的Jar檔案,Jsp和很多的配置檔案與資原始檔。
2.配置solr/home的地址,找到solr\WEB-INF\web.xml編輯
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>G:\lanwon\doc\solrtrain\apache-tomcat-8.5.27\webapps\solrHome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
solr/home:solr配置檔案所在目錄,一般放到與webapps同級的目錄。
注:該路徑不能存在中文.
3、solr home設定:
複製solr解壓目錄下的solr-4.7.1\example\solr目錄到solrHome。
4、設定G:\lanwon\doc\solrtrain\apache-tomcat-8.5.27\webapps\solrHome\collection1\conf\solrconfig.xml
找到下面這項配置,這個是指定你的索引檔案存在什麼地方的
<dataDir>${solr.data.dir:}</dataDir>
5、設定好之後找到tomcat的bin目錄下的startup.bat雙擊啟動。
5-1、輸入http://localhost:8080/solr
現在我們來看看目前支援的分詞是否滿足,我們想要的業務。
5-2、如果我們想支援中文全拼、分詞、英文全拼、英文分詞、該怎麼做。
三、分析器安裝
1、我們需要使用到的jar包、配置如下:
把ik-analyzer.jar、pinyin4j-2.5.0.jar、pinyinAnalyzer.jar、pinyinAnalyzer4.3.1.jar放到solr\WEB-INF\lib下。
2.找到solrHome\collection1\conf\的schema.xml,新增分析器
<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
<analyzer type="index"><!--索引分析器-->
<tokenizer class="solr.KeywordTokenizerFactory"/><!--分詞器-->
<filter class="org.wltea.analyzer.pinyin.solr.PinyinTokenFilterFactory" pinyinAll="true" minTermLength="1" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query"><!--查詢分析器-->
<tokenizer class="solr.KeywordTokenizerFactory"/><!--分詞器-->
<filter class="org.wltea.analyzer.pinyin.solr.PinyinTokenFilterFactory" pinyinAll="true" minTermLength="1" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
</fieldType>
3.安裝完成分析器後,進入http://localhost:8080/solr/檢視效果。
4.選擇當前的core,進入analysis頁面測試分詞效果。
四、資料全量、增量匯入
1、我們需要使用到的jar包、配置如下:
把mysql-connector-java-5.1.43-bin.jar、以及solr-4.7.1\dist\solr-dataimporthandler-4.7.1.jar、solr-dataimporthandler-extras-4.7.1.jar放到solr\WEB-INF\lib下。
2、修改solrHome\collection1\conf\solrconfig.xml新增如下:
<requestHandler name="/dataimport"
class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3、當前目錄新建data-config.xml檔案,該檔案做為連線資料庫及sql。
4、編輯data-config.xml檔案
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.200:3306/clinical_test1" user="root" password="[email protected]" batchSize="-1" />
<document>
<entity name="t_patient" pk="id" query="SELECT patient_idty as id,name FROM t_patient GROUP BY name order by patient_idty "
deltaImportQuery="SELECT patient_idty as id,name FROM t_patient where patient_idty='${dih.delta.id}' GROUP BY name order by patient_idty "
deltaQuery="select patient_idty as id FROM t_patient WHERE UPDATE_TIME > '${dih.last_index_time}' GROUP BY name order by patient_idty ">
>
<field column="id" name="id" />
<field name="name" column="name"/>
</entity>
</document>
</dataConfig>
4、<!-- pk="ID" 必須,因為其中的增量索引查詢主鍵ID時需要 -->
<!-- dataSource="acitvityDB" 這個引用名字是引用上面資料來源的名字 -->
<!-- name="myentity" 存在多個實體時,這個名字必須唯一 -->
<!-- query:用於全量匯入 -->
<!-- deltaImportQuery: 增量匯入起作用,可以返回多個欄位的值,一般情況下,都是返回所有欄位的列 -->
<!-- deltaQuery : 用於增量匯入且只返回ID
deltaQuery="select ID from myentity where my_date > '${dih.last_index_time}'" deltaQuery的意思是,查詢出所有經過修改的記錄的ID 可能是修改操作,新增操作 -->
<!-- deletedPkQuery : 用於增量匯入且只返回ID
deletedPkQuery="select ID from myentity where isdelete=1"
此操作只查詢那些資料庫裡偽刪除的資料的ID(即isdelete標識為1的資料) solr通過它來刪除索引裡面對應的資料 -->
5、找到solrHome\collection1\conf設定對應欄位 對應的 分析器
如果說欄位存在的情況下:
<field name="pinyin" type ="text_pinyin" indexed ="true" stored ="true" multiValued ="true"/>
<copyField source="name" dest="pinyin"/>
Solr主要配置檔案介紹
solrconfig.xml:該檔案是solr的主配置檔案,配置高亮,資料來源,索引大小,索引合併等所有的索引策略配置;
schema.xml:該檔案是配置查詢欄位資訊,定義了所有的資料型別和各索引欄位的資訊(如型別,是否建立索引,是否儲存原始資訊);
data-config.xml:資料庫配置資訊檔案,配置了資料來源資訊,全量索引,增量索引的資料庫查詢……
五、solrJ與spring-data-solr
Solr的客戶端基本上只有一個,那就是solrj。
SolrJ是操作Solr的JAVA客戶端,它提供了增加、修改、刪除、查詢Solr索引的JAVA介面。SolrJ針對 Solr提供了Rest 的HTTP介面進行了封裝, SolrJ底層是通過使用httpClient中的方法來完成Solr的操作。
spring-data-solr是在solrj的基礎上做的封裝,使統一成spring-data的風格
Spring boot整合Solr
1、pom.xml增加配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
2、application.properties增加spring.data.solr.host=http://localhost:8080/solr/collection1
3、呼叫時
@Autowired
private SolrClient server;
示例一
@RequestMapping("/solrTest")
public Object testSolr(String param) throws IOException, SolrServerException {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
try {
SolrQuery query = new SolrQuery();
if(StringUtils.isNotEmpty(param)) {
query.set("q", "pinyin:*" + param + " or name:*"+param);// 高亮查詢欄位
}else {
query.set("q", "pinyin:*");// 高亮查詢欄位
}
QueryResponse qr = server.query(query);// 執行查詢
// List<Test> list = qr.getBeans(Test.class);
SolrDocumentList dlist = qr.getResults();
Map<String, String> mapRe = null;
for (SolrDocument sd : dlist) {
mapRe = new HashMap<String, String>();
mapRe.put("id", sd.getFieldValue("id").toString());
mapRe.put("name", sd.getFieldValue("name").toString());
list.add(mapRe);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
關鍵字加亮
//設定高亮
query.setHighlight(true); // 開啟高亮元件或用query.setParam("hl", "true");
query.addHighlightField("name");// 高亮欄位 多個則多號隔開Song_Name,Song_SingerName
query.set("hl.highlightMultiTerm","true");//啟用多欄位高亮
query.setHighlightSimplePre("<font style=\"color:#A7D043;font-weight:bold;\">"); //標記,高亮關鍵字字首
query.setHighlightSimplePost("</font>");//字尾
通過Map<String, Map<String, List<String>>> map=qr.getHighlighting();獲取加亮的欄位。
六、docker部署
1、編寫DockerFile。
#基本映象
FROM centos
#把你上傳的jdk放到docker容器裡面的root目錄下
ADD jdk-8u121-linux-x64.tar.gz /root
#把你上傳的Tomcat放到docker容器裡面的root目錄下
ADD apache-tomcat-8.0.32.tar.gz /root
#設定環境變數
ENV JAVA_HOME /root/jdk1.8.0_121
#設定環境變數
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#設定環境變數
ENV CATALINA_HOME /root/apache-tomcat-8.0.32
#設定環境變數
ENV CATALINA_BASE /root/apache-tomcat-8.0.32
#設定環境變數
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#執行startup.sh 並開啟日誌
ENTRYPOINT /root/apache-tomcat-8.0.32/bin/startup.sh && tail -F /root/apache-tomcat-8.0.32/logs/catalina.out
執行命令:
docker build -t docker-tomcat-solr .
docker run -d -p 28080:28080 docker-tomcat-solr
docker ps -a
由於以上內容是當初在公司做內部培訓的,很多地方都是現場操作,現場交的,這裡只是把PPT中的內容copy過來了,很多地方不是很詳細勿怪!!!