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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章