solr6.2.0單擊版環境搭建

u014249394發表於2017-04-28
  • 介紹

solr6.2.0單擊版環境搭建   Solr6.2.0學習流程 搭建solr單擊版環境 以下內容為單機版tomcat+solr操作

1、所需軟體

1.1軟體版本:

jdk1.8.0_121 solr6.2.0 eclipse-jee-neon-1a-win32-x86_64 apache-tomcat-8.0.41-windows-x86-x64 備註:如果你的tomcat小於8的話,啟動後訪問solr admin會遇到異常: Java.lang.NoSuchMethodError: javax.servlet.ServletInputStream.isFinished() ;如果你啟動時看到這個,恭喜你,該升級tomcat了,換成8就OK了。

2、解壓目錄

2.1 apache-tomcat-8.0.41-windows-x64目錄

2.2solr6.2.0目錄

2.3 jdk1.8.0_121目錄

 

3 、環境配置

3.1在我們之前配置好的tomcat的webapp目錄下新建一個solr的資料夾

3.2拷貝solr6.2.0包下面server/solr-webapp/webapp中的內容到tomcat新建的solr資料夾下

3.3拷貝solr6.2.0下面server/lib/ext中的jar包到新建的solr下面的WEB-INF\lib中

3.4拷貝solr6.2.0下面server\resources中log4j.properties到新建的solr的WEB-INF中

3.5修改solr\WEB-INF中的web.xml檔案

將註釋的<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>F:\solr\soft\apache-tomcat-8.0.41-windows-x64\webapps\solr_home(你的solr_home)</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>   放開,並將其中的值修改為你的solrhome目錄(solrhome目錄主要配置索引儲存路徑,路徑可自行選擇)。 最後複製solr-6.2.0\server\solr中的所有檔案到solr_home中;如 備註:此處的solr的根目錄和solr_home是兩回事,solr_home資料夾是用來存放索引的,所以solr_home可以在任意資料夾下存在。

4、測試執行

4.1啟動tomcat

訪問首頁:http://localhost:8080/solr/index.html   資料增量(DIH) 以下內容為資料增量操作  

5、建立Core Admin

5.1建立my_core

在solr_home資料夾下新建一個資料夾名字叫做my_core(名字不固定,可以隨便取,但是這個名字在後面的配置中會有所關聯。)然後把官網下下來的solr專案中F:\solr\soft\solr-6.2.0\example\example-DIH\solr\solr\conf資料夾的內容全部複製到my_core中。

6、配置相關包及其路徑

6.1把WEB-INF\lib裡面的jar包配置到專案中

把mysql所需的jar包和solr-6.2.0\dist下的solr-dataimporthandler-6.2.0.jar和solr-dataimporthandler-extras-6.2.0.jar都複製到solr\WEB-INF\lib下。然後在solr_home\my_core\conf\solrconfig.xml檔案中加入:<lib dir="F:/solr/soft/apache-tomcat-8.0.41-windows-x64/webapps/solr/WEB-INF/lib/" regex=".*\.jar" />這段程式碼大約在solrconfig.xml的75行處,前面有一堆類似的程式碼。

7、建立資料庫表

7.1在MYSQL中新建一張表

CREATE DATABASE IF NOT EXISTS solr; USE solr;   DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(10) NOT NULL, `number` INT(20) DEFAULT NULL, `updateTime` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT  INTO `goods`(`id`,`name`,`number`,`updateTime`) VALUES (1,'商品1',100,'2016-11-28 16:48:57'), (2,'商品2',120,'2016-11-28 16:48:57'), (3,'商品3',150,'2016-11-28 16:48:57'), (4,'手機1',50,'2016-11-28 17:44:29');  

8、新增solr-data-config.xml

8.1在solrconfig.xml中新增data-config.xml

在solrconfig.xml的<requestHandler name="/select" class="solr.SearchHandler">之上新增: <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">solr-data-config.xml</str> </lst> </requestHandler>

8.2在conf下新建data-config.xml檔案

修改之前複製過來的solr-data-config.xml檔案。將以下內容新增到solr-data-config.xml中:(此處注意編碼寫成utf8不要寫成utf-8,否則在做solr的dataImport時會報編碼錯誤異常)。 <?xml version="1.0" encoding="UTF8"?> <dataConfig> <dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/solr" user="root" password="123456" batchSize="-1" /> <document> <entity name="goods" pk="id"  dataSource="source1" query="select * from  goods" deltaImportQuery="select * from goods where id='${dih.delta.id}'" deltaQuery="select id from goods where updateTime > '${dataimporter.last_index_time}'"> <field column="id" name="id"/> <field column="name" name="name"/> <field column="number" name="number"/> <field column="updateTime" name="updateTime"/> </entity> </document> </dataConfig> 解釋一下: dataSource是資料庫資料來源。Entity就是一張表對應的實體,pk是主鍵,query是查詢語句。Field對應一個欄位,column是資料庫裡的column名,後面的name屬性對應著Solr的Filed的名字。其中solrdata是資料庫名,goods是表名。 其中deltaQuery是增量索引,原理是從資料庫中根據deltaQuery指定的SQL語句查詢出所有需要增量匯入的資料的ID號。然後根據deltaImportQuery指定的SQL語句返回所有這些ID的資料,即為這次增量匯入所要處理的資料。核心思想是:通過內建變數“${dih.delta.id}”和 “${dataimporter.last_index_time}”來記錄本次要索引的id和最近一次索引的時間。

8.3在conf檔案下的managed-schema配置field資訊

<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" /> <field name="name" type="string" indexed="true" stored="false"/> <field name="number" type="int" indexed="true" stored="false"/> <field name="updateTime" type="date" indexed="true" stored="true" />   <!--下面三個欄位是系統本身不能刪除的,刪除會報錯--> <field name="_version_" type="long" indexed="true" stored="false"/> <field name="_root_" type="string" indexed="true" stored="false" docValues="false" /> <field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/> 注意:id,name,number,updateTime是我們上面資料庫的欄位。下面三個field是系統本身的不能刪除,否則會執行錯誤。

9、測試

9.1啟動tomcat並訪問

啟動tomcat,並在URL中輸入http://127.0.0.1:8080/solr/index.html 路徑。

9.2新增core

點選Core Admin à name àinstanceDir(my_core的路徑)àdataDir(預設data)àconfig(預設)àschema(預設) 說明幾點: name:新建的core的名稱(與5.1的名稱保持一致my_core) instanceDir:就是你的core根目錄,solr就是你的SOLR_HOME,你可以在SOLR_HOME下建立多個core目錄,(與5.1保持一致F:\solr\soft\apache-tomcat-8.0.41-windows-x64\webapps\solr_home\my_core)。 dataDir:表示你core的資料目錄,當前core的索引資料會存放在dataDir下的data\index目錄下,上述所有資料夾需要你手動建立(除了data\index這裡的index目錄,solr會自動建立), Config、schema保持不變。 備註
  • properties不能copy過去,是在建立的時候自動生成,如果copy此檔案,會報錯誤:as another core is already defined there
  • 新建core時,name必須與在solr_home資料夾下面新建的那個my_core的資料夾名稱保持一致,否則在停止tomcat後再啟動時,在core_selector中無法找到之前建立的core。

9.3增量Dataimport

全增量,如下圖。(選擇full_import,勾選clen,否則不勾選)

9.4查詢query

查詢引數說明(solr引數) 在做solr查詢的時候,solr提供了很多引數來擴充套件它自身的強大功能!以下是使用頻率最高的一些引數! 一、常用 q - 查詢字串,這個是必須的。如果查詢所有*:* ,根據指定欄位查詢(Name:張三 AND Address:北京fq - (filter query)過慮查詢,作用:在q查詢符合結果中同時是fq查詢符合的,例如:q=Name:張三&fq=CreateDate:[20081001 TO 20091031],找關鍵字張三,並且CreateDate是在20081001到20091031範圍內 fl - 指定返回那些欄位內容,用逗號或空格分隔多個。 name,subbranch,tel start - 返回第一條記錄在完整找到結果中的偏移位置,0開始,一般分頁用。 rows - 指定返回結果最多有多少條記錄,配合start來實現分頁。 sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,預設是相關性降序。 wt - (writer type)指定輸出格式,可以有 xml, json, php,python,ruby,cvs fl表示索引顯示那些field( *表示所有field,如果想查詢指定欄位用逗號或空格隔開(如:Name,SKU,ShortDescription或Name SKU ShortDescription【注:欄位是嚴格區分大小寫的】)) q.op 表示q 中 查詢語句的 各條件的邏輯操作 AND(與) OR(或) 例如:name:總統府 OR tel:23xxxxxx3 例如: text:總統府 AND text:郵局 或 +text:總統府 +text:郵局 或 name:總統府 AND tel:23xxxxxx3 或 name: ( +總統府 +郵局) df - 預設的查詢欄位,一般預設指定 qt - (query type)指定那個型別來處理查詢請求,一般不用指定,預設是standard。 indent - 返回的結果是否縮排,預設關閉,用 indent=true|on 開啟,一般除錯json,php,phps,ruby輸出才有必要用這個引數。 version - 查詢語法的版本,建議不使用它,由伺服器指定預設值。   hl 是否高亮 ,如hl=true hl.fl 高亮field ,hl.fl=Name,SKU hl.snippets :預設是1,這裡設定為3個片段 hl.simple.pre 高亮前面的格式 hl.simple.post 高亮後面的格式 facet 是否啟動統計 facet.field  統計field   排除查詢 在要排除的詞前加上 “-” (不包含”號) 號 例如: 總統府 -郵局 搜尋結果不會有包含郵局的詞的結果在內 增加權重: 如要搜尋 “中華 加油站”(不包含”號) 但因為回傳太多筆資料內有 “中華”(不包含”號) 或 “加油站”(不包含”號) 的結果, 所以想要把有包含 “加油站”(不包含”號)的資料往前排,可使用 “^”(不包含”號)符號在後面加上愈增加的權重數, 像是 “2″,則可以這樣做:中華 加油站^2 會同時搜尋含有中華或加油站的結果,並把加油站這個詞加權所以搜尋時會先判斷加油站這一個詞在 搜尋結果中的比重,甚至假設一筆資料內加油站出現過兩次以上的就更加會有優先權. 查詢時在查詢詞後加上 “^” (不包含”號) 再加上權重分數 例如: 總統府 AND “郵局”^2 或 總統府^2 OR 郵局 Wildcard 搜尋使用 “*” 符號; 如果輸入 “中國*銀” (不包含”號), 結果會有中國信託商業銀行, 中國輸出入銀行圖書閱覽室, 中國商銀證券 中國及銀之間可夾任何長短字詞. 【注:以上是比較常用的引數,當然具體的引數使用還是多看Solr官方的技術文件以及一些大神的博文日誌,這裡只是拋磚引玉】   二、 Solr運算子
  1. “:” 指定欄位查指定值,如返回所有值*:*
  2. “?” 表示單個任意字元的通配
  3. “*” 表示多個任意字元的通配(不能在檢索的項開始使用*或者?符號)
  4. “~” 表示模糊檢索,如檢索拼寫類似於”roam”的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回相似度在0.8以上的記錄。
  5. 鄰近檢索,如檢索相隔10個單詞的”apache”和”jakarta”,”jakarta apache”~10
  6. “^” 控制相關度檢索,如檢索jakarta apache,同時希望去讓”jakarta”的相關度更加好,那麼在其後加上”^”符號和增量值,即jakarta^4 apache
  7. 布林操作符AND、||
  8. 布林操作符OR、&&
  9. 布林操作符NOT、!、- (排除操作符不能單獨與項使用構成查詢) 10. “+” 存在操作符,要求符號”+”後的項必須在文件相應的域中存在 11. ( ) 用於構成子查詢 12. [] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[200707 TO 200710] 13. {} 不包含範圍檢索,如檢索某時間段記錄,不包含頭尾 date:{200707 TO 200710} 14. / 轉義操作符,特殊字元包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : /
注:①“+”和”-“表示對單個查詢單元的修飾,and 、or 、 not 是對兩個查詢單元是否做交集或者做差集還是取反的操作的符號 比如:AB:china +AB:america ,表示的是AB:china忽略不計可有可無,必須滿足第二個條件才是對的,而不是你所認為的必須滿足這兩個搜尋條件 如果輸入:AB:china AND AB:america ,解析出來的結果是兩個條件同時滿足,即+AB:china AND +AB:america或+AB:china +AB:america 總而言之,查詢語法:  修飾符 欄位名:查詢關鍵詞 AND/OR/NOT 修飾符 欄位名:查詢關鍵詞 三、 Solr查詢語法 1.最普通的查詢,比如查詢姓張的人(Name:張),如果是精準性搜尋相當於SQL SERVER中的LIKE搜尋這需要帶引號(""),比如查詢含有北京的(Address:"北京") 2.多條件查詢,注:如果是針對單個欄位進行搜尋的可以用(Name:搜尋條件加運算子(OR、AND、NOT) Name:搜尋條件),比如模糊查詢(Name:張 OR Name:李)單個欄位多條件搜尋不建議這樣寫,一般建議是在單個欄位裡進行條件篩選,如( Name:張 OR 李),多個欄位查詢(Name:張 + Address:北京 ) 3.排序,比如根據姓名升序(Name asc),降序(Name desc    命令式資料增量 以下內容為命令式操作增量

10、命令式資料增量

至此所有DIH的配置完成,在瀏覽器中輸入命令:

10.1全匯入:

http://localhost:3333/solr/my_core/dataimport?command=full-import&commit=ture

10.2增量匯入:

http://localhost:3333/solr/my_core/dataimport?command=delta-import&clean=false&commit=ture

10.3檢視匯入狀態

http://localhost:3333/solr/my_core/dataimport?command=status

10.4、處理CLOB欄位

<entity name=”meta” query=”select id,filename,content,bytes from documents” transformer=”ClobTransformer” <field column=”ID” name=”id” /> <field column=”CONTENT” name=”CONTENT” clob=”true” /> </entity> ClOB 欄位的 column 必須大寫!!

10.5、DIH記憶體溢位錯誤

在使用DIH時,容易報記憶體溢位錯誤。可以通過設定jvm大小來解決。設定方法如下: 在tomcat\bin\startup.bat 加入SET JAVA_OPTS=-Xms128m -Xmx1024m 配置 這裡設定的是1024M,根據情況可以適量增大。

10.6、自動全匯入和自動增量匯入

此功能可以自己寫程式實現,也可利用apache-solr-dataimportscheduler-1.0.jar包完成此功能。配置如下: 修改solr.war中WEB-INF/web.xml, 在servlet節點前面增加: <listener> <listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class> </listener> 將apache-solr-dataimportscheduler-.jar 中 dataimport.properties 取出並根據實際情況修改,然後放到 solr.home/conf (不是solr.home/core/conf) 目錄下面 IK分詞器 以下內容為IK分詞器配置

11、solr6.2.0配置中文分詞器IK Analyzer

不同於solr其他版本的IK分詞器配置,從solr6以上因為JDK版本的升級等原因,IKAnalyzer2012FF_u1.jar版本已經不再適用,需要升級使用ik-analyzer-solr5-5.x.jar。

11.1下載solr6.0專用的IK Analyzer的jar包和相應的配置檔案。

 

11.2配置檔案

解壓上一個步驟所得到的壓縮包,將ik-analyzer-solr5-5.x.jar這個jar包放入solr專案下的WEB-INF\lib目錄中去,將IKAnalyzer.cfg.xml, stopword.dic放在solr專案下的WEB-INF\classes目錄中去(沒有就建立classes資料夾)。

11.3修改managed-schema檔案

修改/solr_home/collection1/conf/中的schema.xml中增加如下內容: <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> 具體欄位引用如下:(例如姓名需要使用分詞器那麼,將name欄位的設定修改以下,如以下修改) 修改filed 使filed引用text_ik.這樣才能使用IK分詞器。 <field name="name" type="text_ik" indexed="true" stored="true"/>

11.4:在solr應用中測試,示例如下圖:

11.5修改solrconfig.xml檔案

修改E:\solr\solr_home\collection1\conf\solrconfig.xml檔案配置生成的索引檔案路徑,示例如下: <dataDir>${solr.data.dir:E:/solr/solr_home/data}</dataDir>

12、solr+IK實現同義詞設定

12.1、在solr_home\core1\conf\synonyms.txt檔案中新增同義詞。

=>指一對一,以逗號分隔的是組群,也就是多對多。 備註:做ik同義詞分詞時,開啟.txt檔案新增同義詞後; 需要用ue另存為 無BOM 的 UTF-8 編碼,否則啟動tomcat報錯java.nio.charset.MalformedInputException: Input length = 1。

12.2在solr_home\core1\conf\managed-schema檔案中配置同義詞。

備註:,如果需要使用以逗號分隔的組群,建立多對多的關係,需要將上面的expand="true"設定為true。

13、solr+ik實現自定義分詞

13.1F:\kingdom\apache-tomcat-8.0.41\webapps\solr\WEB-INF\classes目錄下的IKAnalyzer.cfg.xml配置檔案,新增如下配置 ext.dic;

 

13.2新建ext.dic檔案,在裡面新增如下內容(注意:ext.dic的編碼必須是Encode in UTF-8 without BOM,否則自定義的詞庫不會被識別)

13.3重啟solr,在控制檯core admin裡reload一下,測試驗證。

14、停止詞設定

停止詞:lucene的停止詞是無功能意義的詞,比如is 、a 、are 、”的”,“得”,“我” 等,這些詞會在句子中多次出現卻無意義,所以在分詞的時候需要把這些詞過濾掉。 擴充套件詞庫:就是不想讓哪些詞被分開,讓他們分成一個詞。 同義詞:假設有一個電子商務系統,銷售書籍,提供了一個搜尋引擎,一天,市場部的人要求客戶在搜尋書籍時,同義詞就是比如輸入“電子”,除了展示電子相關的書籍,還需要展現“機器”相關的書籍。 以IK分詞器為例子說明怎麼配置。

14.1:配置停止詞和擴充套件詞庫。

將IKAnalyzer解壓資料夾下的stopword.dic和IKAnalyzer.cfg.xml複製到tomcat/webapps/solr/WEB-INF/classes下,再新建一個ext.dic,裡面的格式和stopword.dic一致。 並修改IKAnalyzer.cfg.xml如下面的格式可以配置多個停止詞或者擴充套件詞庫檔案。 <properties> <comment>IK Analyzer 擴充套件配置</comment> <!--使用者可以在這裡配置自己的擴充套件字典-->   <entry key="ext_dict">ext.dic;</entry>   <!--使用者可以在這裡配置自己的擴充套件停止詞字典-->   <entry key="ext_stopwords">english_stopword.dic;stopword.dic</entry> 這樣就完成了。我在擴充套件詞庫ext.dic裡面加上了 呼吸式酒精測試 測試擴充套件詞庫成功

14.2.同義詞配置。

為了讓例子簡單,我們假設索引庫只有兩個欄位。 1.在solr資料檔案conf目錄下schema.xml 中加入以下兩個欄位: <field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="description" type="text_syn" indexed="true" stored="true" /> 在 schema.xml 中增加 text_syn 型別的定義: <fieldType name="text_syn" class="solr.TextField"> <analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> 3.在相同的conf目錄下的 synonyms.txt 中增加 machine => electronics 配置完成 備註:以上所有的配置都需要重新生成索引來測試。    
  • 參考

本文為原創,如果您當前訪問的域名不是surenpi.com,請訪問“素人派”。

檢視原文:http://surenpi.com/2017/04/28/solr6-2-0%e5%8d%95%e5%87%bb%e7%89%88%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/

相關文章