solr聯合多個字段進行檢索(multivalued和copyfield的使用)

在實際工作中不僅僅對索引中的單個字段進行搜索。需要進行綜合查詢。
比如book表中有id,name(標題),price,summary(摘要),content(內容),我們要找一本書的時候,查詢關鍵字“平凡的世界”,需要從標題或者摘要或者內容裏包含這個關鍵字時就算找到了。這就需要使用copyField和multiValue標籤了。

在schema.xml中將需要檢索的字段,使用copyField拷貝到一個新的searchText的field中,並設置這個searchText field的multivalue屬性爲true即可。

    <fields>  
         <field name="id" type="string" indexed="true" stored="true" required="true" />  
         <field name="name" type="textMaxWord_cn" indexed="true" stored="true" />  
         <field name="price" type="long" indexed="true" stored="true" />  
         <field name="summary" type="textMaxWord_cn" indexed="true" stored="true" />  
         <field name="content" type="textMaxWord_cn" indexed="true" stored="true" />  
         <field name="searchText" type="textMaxWord_cn" indexed="true" stored="false" multiValued="true" /> 
         <field name="createTime" type="string" indexed="true" stored="false" /> 
     </fields>  

     <uniqueKey>id</uniqueKey>  
     <defaultSearchField>searchText</defaultSearchField>  
     <solrQueryParser defaultOperator="AND" />  

     <copyField source="name" dest="searchText" />  
     <copyField source="summary" dest="searchText" />  

且可設置檢索的時候,哪個field佔的權重多一點。
在solrconfig.xml中可設置如下:


<requestHandler name="dismax" class="solr.SearchHandler">
    <lst name="defaults">
        <str name="defType">edismax</str>
        <str name="echoParams">explicit</str>
        <float name="tie">0.1</float>
        <!--
        <str name="bf">scoreParser(type)</str>
        -->
        <str name="bf">sum(recip(ms(NOW,last_modified),3.16e-11,1,1),div(1000,price))^100</str>
        <str name="pf">
            name^100 summary^50 content^20
        </str>
        <str name="qf">
            name^10 summary^ content^2
        </str>

</requestHandler>

在網上找了這兩個參數的定義:

pf: 可提供對一條記錄的多個字段做匹配的功能
qf: 針對查詢的每個字段設置不同的boost權重打分,其設置的字段必須爲在pf中配置的項。

事例解釋

http://localhost:8080/solr/select?defType=dismax&qf=name^10 summary ^1 &q=平凡的世界&pf=name^50 summary ^1&q.op=OR&bf=sum(recip(ms(NOW,createTime),3.16e-11,1,1),div(1000,price))^100
該查詢表示:在name和summary 中搜索關鍵字“平凡的世界”,name和summary 在字段查詢中的比重分別爲10、1(qf=qf=name^10 summary ^1);並且這兩個字段phrase的打分爲
pf=name^50 summary ^1,也就是name佔的比重爲50,而summary佔的比重小點;且該查詢考慮了書本的價格和書的上架時間(bf=sum(recip(ms(NOW,last_createTime),3.16e-11,1,1),div(1000,price))^100)

bf可以自己實現自己的定義。
關於多字段檢索也可看看這篇文章的介紹:http://adminjun.iteye.com/blog/2258480

在實際項目中可能會存儲clob類型的字段,這就需要另外的處理,詳細請參照博客http://blog.csdn.net/u010248330/article/details/72957645

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