一、定義
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http
Get操作提出查找請求,並得到XML格式的返回結果。
基於Lucene的全文搜索服務器。同時對其進行了擴展,提供了比Lucene更爲豐富的查詢語言,同時實現了可配置、可擴展並對查詢性能進行了優化,並且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎
二 、搭建服務:
參見 點擊打開鏈接
三、創建任務
當你的環境以安裝solr服務 後,按照自己想要實現的功能創建自己的solr 任務
距離 我想創建一個 testQuery
1.在solr目錄下 執行:./bin/solr create -c testQuery (創建成功 會有一個成功提示的 ,到目前爲止solr 裏面已經有一個爲某一個)
此時在solr/server/solr 下面出現 testQuery 目錄
2.啓動solr : ./bin/solr restart
3.testQuery 目錄結構 :
主要修改 都在conf下面
conf 目錄結構:
data-config.xml文件 是添加索引 表結構 的 ,當每次將數據庫數據導入solr 時候需要按照這個文件定義的結構去導入
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://11.11.11.11:800/database"
user="root" password="123456"/>
<document>
<entity name="database" query="SELECT * FROM table; "
deltaQuery="SELECT id FROM table where `create` > unix_timestamp('${dataimporter.last_index_time}' ; "
deltaImportQuery="SELECT * FROM table where id =${dataimporter.delta.tid}" pk='tid'>
<field column="id" name="id" />
<field column="subject" name="subject" />
<field column="views" name="views" />
<field column="vip" name="vip" />
<field column="message" name="message" />
<field column="create" name="create" />
</entity>
</document>
</dataConfig>
dataConfig 裏面是對數據庫導入的一個配置
dataSource:數據庫連接配置
document:數據庫索引配置
entity:name= 數據庫名字
query=全量導入數據的sql
deltaQuery:增量導入的id
deltaImportQuery:增量導入的sql
解釋一下全量和增量:正常數據庫導入solr第一次是全部導入,但是隨着時間的變化數據庫和solr數據不一致,這時候需要再次導入,按時間技術,半小時或者更合適的時間,只需要增量導入即可,更合適的時間再次全量導入即可
field 這些是返回字段的定義
==到現在數據庫和solr的關係完事了,下面是solr自身對這些字段的處理
schema.xml 是被 solrconfig.xml 加載或者調用的 ,負責設置 每次查詢的展示字段 、負責設置關聯查詢、負責設置停止詞 近義詞 的 設置
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
在conf下面的 managed-schema 文件裏對索引配置
1.配置中文分詞mmseg4j
<!-- mmseg4j-->
<fieldType name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100" >
<analyzer type="index">
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="solr-5.5.3/server/solr/discuz/conf/dic"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="solr-5.5.3/server/solr/discuz/conf/dic"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
</analyzer>
</fieldType>
<fieldType name="text_mmseg4j_maxword" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="solr-5.5.3/server/solr/discuz/conf/dic"/>
</analyzer>
</fieldType>
<fieldType name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="solr-5.5.3/server/solr/discuz/conf/dic"/>
</analyzer>
</fieldType>
<!-- mmseg4j-->
solr-5.5.3/server/solr/discuz/conf/dic:中文分詞的分詞庫目錄,在改目錄下放word.dic分詞文件
stopwords.txt:停詞文件
synonyms.txt:近義詞文件
analyzer type="index":索引檢查分詞、停詞、近義詞
analyzer type="query":查找檢查分詞、停詞、近義詞
2.配置索引字段、字段類型、查詢字段的中文分詞類型<field name="submes" type="<span style="color: #ff6600;">text_mmseg4j_complex</span>" indexed="true" stored="true" required="true" multiValued="true" />
<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="vip" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="views" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="create" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="subject" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="message" type="text_general" indexed="true" stored="true" required="true" multiValued="false" />
<copyField source="subject" dest="submes" />
<copyField source="vip" dest="submes" />
<copyField source="views" dest="submes" />
<copyField source="create" dest="submes" />
field 字段定義了solr展示的類型
name:字段名字
type:字段類型(如果是要進行查詢的字段,類型爲中文分詞類型如:text_mmseg4j_complex)
indexed:true
stored:true
required:true
multiValued:查詢字段設置爲true ,其他爲false
copyField : 拷貝需要索引的字段到整合字段中 submes是本列子中的整合字段 solr查詢也是查詢這個字段
這個字段可以根據多個字段進行權重設置,並且打分,排序
五.使用
1.增量導入,在你的solr使用界面上左邊下拉框找到discuz
下面出現的
Dataimport: 是執行增量全量導入的
query:搜索
analysis:分詞
無法加載圖片,根據很難形容,但是打開這個界面就知道了
2.搜索打分:有的時候我們除了想根據匹配度排序外,還想根據瀏覽量、創建時間、是否是vip等綜合因素排序,
在curl請求時 請求參數要加上下面的值:
$params['defType'] = 'edismax' ;
$params['bf'] = "sum(linear(vip,1000,0),linear(sqrt(log(linear(views,1,2))),100,0),sqrt(log(create)))";
bf裏面的參數是solr支持的打分標準的函數,具體使用參考點擊打開鏈接詳解 很不完善,後續還會完善,如有問題隨時提問