其實簡單的說,Solr是一個基於Apache Lucene 項目的開源企業級搜索平臺,是用JAVA編寫的、運行在Servlet容器中的一個獨立的全文搜索服務器(換句話說就是個JAVA-WEB APP),並具有類似REST的HTTP/XML和JSON的API。
主要功能包括全文檢索,高亮命中,分面搜索(faceted search),近實時索引,動態集羣,數據庫集成,富文本索引,空間搜索;通過提供分佈式索引,複製,負載均衡查詢,自動故障轉移和恢復,集中配置等功能實現高可用,可伸縮和可容錯。
Solr和Lucene的關係
Solr是Lucene的一個子項目,它在Lucene的基礎上進行包裝,成爲一個企業級搜索服務器開發框架。
Solr與Lucene的主要區別體現在:
Solr更加貼近實際應用,是Lucene在面向企業搜索服務領域的擴展;
Solr的緩存等機制使全文檢索獲得性能上的提升;通過配置文件的開發使得Solr具有良好的擴展性;
Solr提供了用戶友好的管理界面與查詢結果界面。
1.去官網下載solr
http://www-eu.apache.org/dist/lucene/solr/6.5.1/
還需要安裝java環境 這裏就不說了 請先自行安裝java
2.解壓 進入文件夾 啓動
bin/solr start
通過瀏覽器訪問 http://localhost:8983即可看到Solr的管理界面。上面的這條命令是按照單機模式啓動,還有cloud模式,顧名思義應該是solr集羣了。
3.創建一個SolrCore
首先保證Solr正常啓動了
在命令行中新建。轉到$Solr.Install.Dir,輸入一下命令:
bin/solr create -c test
在/server/solr 目錄下 會有一個 test文件夾
4.從mysql導入數據
這個是我的表數據
+----+----------+---------+--------------------------------+
| id | userName | userAge | userAddress |
+----+----------+---------+--------------------------------+
| 1 | summer | 30 | shanghai |
| 2 | test1 | 22 | suzhou |
| 3 | test1 | 29 | some place |
| 4 | lu | 28 | some place |
| 5 | xiaoxun | 27 | nanjing |
| 6 | xiaoli | 50 | 北京市大興區麗園小區 |
| 7 | zhanlu | 50 | 上海市浦東新區 |
| 8 | xiaolsdf | 50 | 黑龍江省哈爾濱市 |
+----+----------+---------+--------------------------------+
首先導入兩個jar分別是solr-dataimporthandler-5.5.0.jar和mysql-connector-java-5.1.38-bin.jar,前一個可以在solr的解壓目錄下的dist目錄中獲取,後一個我想大家都可以找到的。
將這兩個jar包複製到$Solr.Install.Dir/server/solr-webapp/webapp/WEB-INF/lib這個目錄下。
1. 默認dataImport功能在Solr中是禁用的,需要在$SolrHome/conf/solrconfig.xml(我的目錄是server/solr/test)中添加如下配置開啓數據導入功能:
<!-- Data import from mysql 要放在<config></config>中哦-->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
因爲前面定義了導入的配置文件是data-config.xml,所以在solrconfig.xml同級目錄下新建這個文件,貼出我的配置,內容如下:
<dataConfig>
<dataSource name="fromMysql"
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mybatis"
user="root"
password="root23place"/>
<document>
<entity name="user" query="SELECT * FROM user" transformer="RegexTransformer">
<field column="id" name="id"/>
<field column="userName" name="userName"/>
<field column="userAge" name="userAge"/>
<field column="userAddress" name="userAddress"/>
</entity>
</document>
</dataConfig>
其中fromMysql爲數據源自定義名稱,隨便取,沒什麼約束,type這是固定值,表示JDBC數據源,後面的driver表示JDBC驅動類,這跟你使用的數據庫有關,url即JDBC鏈接URL(mybatis是我要連接的數據庫的名字就是database),後面的user,password分別表示鏈接數據庫的賬號密碼,下面的entity映射有點類似hiberante的mapping映射,column即數據庫表的列名稱,name即schema.xml中定義的域名稱。
在 schema.xml(如果沒有就新建一個)中加入
<field name="userName" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="userAge" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="userAddress" type="string" indexed="true" stored="false" multiValued="true"/>
這裏面的字段就是你數據庫裏要導入的字段
**重啓Solr,進入管理頁面,選中test這個Core,進入Dataimport這個選項。如果一切正常會出現如下圖所示的界面。
下面開始導入
full-import:全量導入,它會覆蓋原有的索引
delta-import:即增量導入,它會在原有索引的基礎上追加
下面的幾個多選框含義解釋如下:
verbose:這個選項設爲true的話,會打印導入的一些中間過程的詳細信息,有利於調試以及瞭解內部操作細節
clean:表示是否在導入數據創建索引之前先清空掉原有的索引
commit:表示是否立即提交索引
optimize:表示是否優化索引
debug: 表示是否開啓調試模式
選擇你的entity
點擊execute導入
我們可以通過Refresh Status這個按鈕刷新狀態,如果出現錯誤或者Fetched一直是0,那就表明有問題了,你要查看日誌進行檢查。如果導入成功,就會看到下圖所示的情況:
在查詢中點擊Execute Query按鈕,就能看到我們導進去並建好索引的信息,更具體的查詢用法後面會講到,下面是默認的查詢,顯示文檔的所有信息。
這樣就基本成功了
下面來做中文支持
分詞方法很多 我們採用mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )實現的中文分詞器,並實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用
將下載的mmseg4j-core-1.10.0.jar和mmseg4j-solr-2.3.0.jar複製到
配置分詞,修改schema.xml配置,末尾增加如下:
<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" />
</analyzer>
</fieldtype>
<fieldtype name="textMaxWord" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" />
</analyzer>
</fieldtype>
<fieldtype name="textSimple" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" />
</analyzer>
</fieldtype>
在 schema.xml中修改
<field name="userAddress" type="textComplex" indexed="true" stored="false" multiValued="true"/>
重啓 solr
在query中進行測試
說明中文支持成功!