solr6.2.0單擊版環境搭建
-
介紹
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運算子- “:” 指定欄位查指定值,如返回所有值*:*
- “?” 表示單個任意字元的通配
- “*” 表示多個任意字元的通配(不能在檢索的項開始使用*或者?符號)
- “~” 表示模糊檢索,如檢索拼寫類似於”roam”的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回相似度在0.8以上的記錄。
- 鄰近檢索,如檢索相隔10個單詞的”apache”和”jakarta”,”jakarta apache”~10
- “^” 控制相關度檢索,如檢索jakarta apache,同時希望去讓”jakarta”的相關度更加好,那麼在其後加上”^”符號和增量值,即jakarta^4 apache
- 布林操作符AND、||
- 布林操作符OR、&&
- 布林操作符NOT、!、- (排除操作符不能單獨與項使用構成查詢) 10. “+” 存在操作符,要求符號”+”後的項必須在文件相應的域中存在 11. ( ) 用於構成子查詢 12. [] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[200707 TO 200710] 13. {} 不包含範圍檢索,如檢索某時間段記錄,不包含頭尾 date:{200707 TO 200710} 14. / 轉義操作符,特殊字元包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : /
10、命令式資料增量
至此所有DIH的配置完成,在瀏覽器中輸入命令:10.1全匯入:
http://localhost:3333/solr/my_core/dataimport?command=full-import&commit=ture10.2增量匯入:
http://localhost:3333/solr/my_core/dataimport?command=delta-import&clean=false&commit=ture10.3檢視匯入狀態
http://localhost:3333/solr/my_core/dataimport?command=status10.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 配置完成 備註:以上所有的配置都需要重新生成索引來測試。-
參考
檢視原文: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/
相關文章
- 基於docker 搭建redis環境—redis單機版DockerRedis
- flutter環境搭建mac版FlutterMac
- windbg 搭建雙擊除錯環境除錯
- 單機搭建ASM環境ASM
- Web 前端環境搭建 Vue版Web前端Vue
- 單機版搭建Hadoop環境圖文教程詳解Hadoop
- hadoop的單機環境搭建Hadoop
- ZooKeeper 系列(二)—— Zookeeper單機環境和叢集環境搭建
- 環境搭建
- Angular環境搭建及簡單體驗Angular
- Zookeeper環境搭建及簡單練習
- 筆記-Flutter開發環境搭建Mac版筆記Flutter開發環境Mac
- windows環境下Django環境搭建WindowsDjango
- Storm 系列(三)—— Storm 單機版本環境搭建ORM
- Windows 10環境簡單搭建ELK叢集Windows
- angular中使用Echarts(環境搭建+簡單使用)AngularEcharts
- 前端單元測試之Karma環境搭建前端
- GoldenGate簡單複製環境的搭建Go
- Windows環境下ELK簡單搭建記錄Windows
- react環境搭建React
- LNMP 環境搭建LNMP
- 搭建Java環境Java
- Vagrant 環境搭建
- Flutter環境搭建Flutter
- swoft 環境搭建
- OpenGL 環境搭建
- 搭建gym環境
- 搭建lnmp環境LNMP
- Angular環境搭建Angular
- JDK環境搭建JDK
- keil環境搭建
- Dubbo環境搭建
- mac搭建環境Mac
- FNA 環境搭建
- FNA環境搭建
- Maven 環境搭建Maven
- spark環境搭建Spark
- Hive環境搭建Hive