solr的原理不和大家一一講述,主要講solr在使用過程中的注意事項
一.solr建立服務
首先是安裝solr,安裝步驟省略。。。。(不要說我懶,安裝步驟導出都是。。。)
成功之後 需要在solr裏面建立一個針對你的業務的服務,我想建立一個叫做discuz的服務
./bin/solr create -c discuz
然後你在你的solr目錄 :solr-5.5.3/server/solr/ 下看見了discuz ,這是你剛剛創建的,針對某一業務的整個搜索配置都是在這個目錄下配置的。
discuz目錄解析:
1.conf :配置文件(索引、分詞庫、停詞庫等等配置)
2.core.properties
3.data
二.建立索引
建立索引就是數據庫和solr建立一個關係,可以滿足數據庫數據定時導入solr裏面,方面solr實現搜索。那麼怎麼建立索引呢?
在solr-5.5.3/server/solr/discuz/conf/data-config.xml 裏面
<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自身對這些字段的處理
三.solr 對展示字段以及搜索的配置
在solr-5.5.3/server/solr/discuz/conf/solrconfig.xml
1.添加一下代碼
<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="text_mmseg4j_complex" 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查詢也是查詢這個字段
這個字段可以根據多個字段進行權重設置,並且打分,排序
四.重啓solr
discuz配置都已經更改完,現在需要重啓生效:
./bin/solr restart
對於一些大的網站而言,重啓整個solr回導致其他業務無法搜索,所以可以搞一個zookeep 來一個分佈式 管理就可以了
五.使用
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支持的打分標準的函數,具體使用參考http://mxsfengg.iteye.com/blog/352191 詳解 很不完善,後續還會完善,如有問題隨時提問