solr的使用

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 詳解  很不完善,後續還會完善,如有問題隨時提問

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章