1. 程式人生 > >Solr單機版簡介和安裝以及Spring boot整合使用

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過來了,很多地方不是很詳細勿怪!!!