學習Solr前需要有Lucene的基礎
Lucene的一些簡單用法:https://www.cnblogs.com/dddyyy/p/9842760.html
1.部署Solr到Tomcat(Windows)
Solr自帶小型服務器jetty,但在我們開發環境中,習慣使用Tomcat,所以把Solr部署到Tomcat上(Tomcat 8.0以上,jdk 1.8以上)
其實步驟相同,但在windows配置要方便一些,所以第一次還是使用Windows來部署。
1.1 准備工作
Solr下載地址:http://archive.apache.org/dist/lucene/solr/
Tomcat下載地址:http://tomcat.apache.org/
1.2 把 solr-7.5.0\server\solr-webapp下的webapp文件夾移到apache-tomcat-9.0.12\webapps下並改名solr(這個名字隨便起)
1.3 導入運行時候需要的依賴包,把solr-7.5.0\server\lib\ext下的包放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib下,
把solr-7.5.0\server\lib下m開頭的五個jar和gmetric4j-1.0.7.jar放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib下
1.4 在任意地方創建一個solrHome,里面有一個solrCore,個人和我們的數據庫類似,一個用戶下可以創建很多個不同的數據庫
1.5 把solr-7.5.0\server下的solr文件夾下的內容復制到solrHome下
1.6 修改默認的solrHome,在apache-tomcat-9.0.12\webapps\solr\WEB-INF的web.xml修改 加上
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>D:\Solr\solrHome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
env-entry-value寫自己的solrHome位置
並注釋以下這段話,不然會報403
<!-- Get rid of error message --> <!--<security-constraint> <web-resource-collection> <web-resource-name>Disable TRACE</web-resource-name> <url-pattern>/</url-pattern> <http-method>TRACE</http-method> </web-resource-collection> <auth-constraint/> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Enable everything but TRACE</web-resource-name> <url-pattern>/</url-pattern> <http-method-omission>TRACE</http-method-omission> </web-resource-collection> </security-constraint>-->
1.7 把solr-7.5.0\server\resources的log4j2.xml放到apache-tomcat-9.0.12\webapps\solr\WEB-INF的classes文件夾下,classes文件剛開始沒有,自己創建一個。
1.8 啟動Tomcat
2.界面的簡單介紹
2.1.Dashboard
儀表盤,顯示了系統資源,jvm等信息
2.2.Logging
Solr運行的日志
2.3 Core Admin
Solr Core的管理頁面
2.4 java properties
Solr在JVM 運行環境中的屬性信息,包括類路徑、文件編碼、jvm內存設置等信息
2.5 Thread Dump
顯示Solr Server中當前活躍線程信息,同時也可以跟蹤線程運行棧信息
3.創建一個solrCore
既然之前說類似於數據庫,使用數據庫之前肯定就要先創建數據庫,我們使用Solr就要先創建一個solrCore,直接使用可視化界面創建
報錯了,解決方法:solr-7.5.0\server\solr\configsets\_default下的config文件移到solrHome\new_core下
重啟Tomcat
在點擊下add core 就出現了
一個MySql實例可以創建多個數據庫,所以我們當然可以創建多個solrCore啦
修改core.properties
重啟Tomcat
4.Solr中的重要信息配置
在增刪查改前,我們要先了解一點Solr的信息配置
在Lucenc中有域和索引的概念,域是由域名和域的內容構成的,域名經過分詞,形成索引。
在Lucene中域是有類型的,比如StringField,LongField類型等,那么在Solr中域的類型由寫在solrHome\new_core\conf\managed-schema中
4.1 fieldType 域類型
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <!-- in this example, we will only use synonyms at query time <filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> <filter class="solr.FlattenGraphFilterFactory"/> --> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
name:類型名字
class:指定該域類型對應的solr類型
analyzer:指定分詞器(中文使用ikanalyzer)屬性type index,query表示在創建索引和查詢索引時使用的分詞器
tokenizer:分詞器的類型
filter:過濾器的類型
4.2 fieldtype 域
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
name:域的名字
type:域的類型(自己定義的)
indexed:是否索引
stroed:是否存儲
required:是否必須
multiValued:是否多值
4.3 dynamicField 動態域
<dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
例子:為文檔增加域的時候,你可以用 “隨便起的_i”當做域名, 凡是以_i結尾的 type都是pint,需要indexed,需要stored
4.4 uniqueKey 唯一鍵
<uniqueKey>id</uniqueKey>
表示id唯一
5.配置中文分詞器 ikanalyzer
既然要添加索引,添加索引之前需要luncenc幫我們分詞,而官方的分詞器對中文的分詞基本是稀爛的,所以我們需要使用第三方的分詞器 ikanalyzer
5.1 下載ikanalyzer
下載地址:https://github.com/magese/ik-analyzer-solr7
5.2 配置ikanalyzer
首先把ik-analyzer-7.5.0.jar放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib目錄下
然后:
5.3 使用ikanalyzer
在solrHome\new_core\conf\managed-schema中自定義fieldtype和field,使用中文分詞器來分詞
<!--IKAnalyzer--> <fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <!--IKAnalyzer Field--> <field name="title_ik" type="text_ik" indexed="true" stored="true" /> <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
5.4 測試一下
重啟tomcat
問題來了,我的名字沒有加到詞庫,但是如果隨着新的詞語出現,我們就沒辦法分詞了,ik分詞器給我們提供了可以手動或自動加入詞匯的方法
apache-tomcat-9.0.12\webapps\solr\WEB-INF\classes下的ext.dic加入自己的詞匯,重啟Tomcat
6.使用可視化界面增刪查改文檔
增加文檔
更新文檔
刪除文檔
查詢文檔
首先查詢所有 *:*
加上過濾條件等一系列條件
q: 查詢關鍵字 查詢所有*:* 查詢固定的 就用 域名:域值
fq:過濾查詢
sort:排序 格式 : 先寫域名然后加升序或降序 ,不同域用逗號隔開 id desc,title_ik desc
start row : 用於分頁
fl:返回指定的域和域值,不同域用逗號隔開
df:指定一個搜索域,用處:比如有的時候你在百度查 “Solr”,你輸入的應該直接是Solr,不會輸一個Content:Solr吧,那么我們就可以指定默認搜索域Content,你輸入Solr就默認加上域值。
wt:指定輸出格式
hi:是否高亮,在指定的域中,比如我搜索中國,經過分詞,在title_ik域中找到了中國,那么在中國這兩個字之前就加上pre前綴,在后面加上post后綴
7.使用SolrJ
Solr和SolrJ的關系類似於MySQL和JDBC,用java代碼來完成文檔的增加。
7.1壞境搭建
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.5.0</version> </dependency>
7.2 代碼
package com.dingyu.sSolrJ; import java.io.IOException; import org.apache.commons.math3.geometry.partitioning.BSPTreeVisitor.Order; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.junit.Test; /** * SolrJ的簡單使用 * * @author 丁宇 * */ public class SolrJTest { /** * 獲得連接 * * @return 連接對象 */ private HttpSolrClient getClient() { HttpSolrClient client = new HttpSolrClient.Builder("http://127.0.0.1:8080/solr/new_core").build(); return client; } /** * 增加/修改文檔 * * @throws SolrServerException * @throws IOException */ @Test public void addOrUpdateDoc() throws SolrServerException, IOException { // 獲得連接對象 HttpSolrClient client = getClient(); // 創建一個文檔對象 SolrInputDocument document = new SolrInputDocument(); // 加域 document.addField("id", "521"); document.addField("title_ik", "張三說的在理"); // 提交 client.commit(); client.close(); } /** * 刪除文檔 * * @throws SolrServerException * @throws IOException */ @Test public void deleteDoc() throws SolrServerException, IOException { // 獲得連接對象 HttpSolrClient client = getClient(); // 根據id刪除 client.deleteById("521"); client.commit(); client.close(); } /** * 查詢文檔 * @throws SolrServerException * @throws IOException */ @Test public void selectDoc() throws SolrServerException, IOException { // 獲得連接對象 HttpSolrClient client = getClient(); // 搜索條件 SolrQuery query = new SolrQuery("*:*"); //設置過濾條件 query.setFilterQueries("title_ik:[10 TO 20]"); //排序 query.setSort("title_ik",ORDER.asc); //分頁 query.setStart(0); query.setRows(10); //要顯示的域 query.setFields("id","title_ik"); // 設置默認搜索域 query.set("df", "product_name"); // 設置高亮 query.setHighlight(true); query.addHighlightField("title_ik"); query.setHighlightSimplePre("<em>"); query.setHighlightSimplePost("</em>"); //執行查詢 QueryResponse response = client.query(query); //查詢結果,一個文檔集合 SolrDocumentList results = response.getResults(); //遍歷 for (SolrDocument solrDocument : results) { //根據key 獲得value System.out.println(solrDocument.get("id")); } client.close(); } }
7.3測試結果