利用solr實現商品的搜尋功能
問題提出:當我們訪問購物網站的時候,我們可以根據我們隨意所想的內容輸入關鍵字就可以查詢出相關的內容,這是怎麼做到呢?這些隨意的資料不可能是根據資料庫的欄位查詢的,那是怎麼查詢出來的呢,為什麼千奇百怪的關鍵字都可以查詢出來呢?
答案就是全文檢索工具的實現,luncence採用了詞元匹配和切分詞。舉個例子:北京天安門------luncence切分詞:北京 京天 天安 安門 等等這些分詞。所以我們搜尋的時候都可以檢索到。
有一種分詞器就是IKAnalyzer中文分詞器,它有細粒度切分和智慧切分,即根據某種智慧演算法。
這就使用solr的最大的好處:檢索功能的實現。
使用步驟;
(1)solr伺服器搭建,因為solr是用java5開發的,所以需要jdk和tomcat。搭建部署
(2)搭建完成後,我們需要將要展示的欄位引入solr的庫中。配置spring與solr結合,工程啟動的時候啟動solr
(3)將資料庫中的查詢內容匯入到solr索引庫,這裡使用的是solrj的客戶端實現的。具體使用可以參考api
(4)建立搜尋服務,供客戶端呼叫。呼叫solr,查詢內容,這中間有分頁功能的實現。solr高亮顯示的實現。
(5)客戶端接收頁面的請求引數,調用搜索服務,進行搜尋。
業務欄位判斷標準:
1、在搜尋時是否需要在此欄位上進行搜尋。例如:商品名稱、商品的賣點、商品的描述
(這些相當於將標籤給了solr,匯入商品資料後,solr對這些欄位的對應的商品的具體內容進行分詞切分,然後,我們就可以搜尋到相關內容了)
2、後續的業務是否需要用到此欄位。例如:商品id。
需要用到的欄位:
1、商品id
2、商品title
3、賣點
4、價格
5、商品圖片
6、商品分類名稱
7、商品描述
Solr中的業務欄位:
1、id——》商品id
其他的對應欄位建立solr的欄位。
<field name="item_title" type="text_ik" indexed="true" stored="true"/> <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/> <field name="item_price" type="long" indexed="true" stored="true"/> <field name="item_image" type="string" indexed="false" stored="true" /> <field name="item_category_name" type="string" indexed="true" stored="true" /> <field name="item_desc" type="text_ik" indexed="true" stored="false" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_title" dest="item_keywords"/> <copyField source="item_sell_point" dest="item_keywords"/> <copyField source="item_category_name" dest="item_keywords"/> <copyField source="item_desc" dest="item_keywords"/> |
重新啟動tomcat
Solr 是Apache下的一個頂級開源專案,採用Java開發,它是基於Lucene的全文搜尋伺服器。Solr提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴充套件,並對索引、搜尋效能進行了優化。
Solr是一個全文檢索伺服器,只需要進行配置就可以實現全文檢索服務。有效降低頻繁訪問資料庫對資料庫造成的壓力。
第一步:將solr部署在Linux系統下。
第二步:solrJ是solr的客戶端,使用它需要依賴solrJ的jar包。
第三步:將資料庫的內容新增到solr的索引庫,這樣查詢就在索引庫查詢,而不是資料庫了。
controller層:
1 2 3 4 5 6 7 8 9 10 11 12 |
@Controller
@RequestMapping ( "/manager" )
public class ItemController
{
@Autowired
private ItemService
itemService;
@RequestMapping ( "/importall" )
@ResponseBody
public TaotaoResult
importAllItem(){
TaotaoResult
result= itemService.importAllItem();
return result;
}
}<br>service層編寫:<br>多表查詢商品,顯示在頁面的邏輯編寫:<br>mapper.java
|
1 2 3 4 5 6 7 8 9 10 11 |
package com.taotao.search.mapper;
import java.util.List;
import com.taotao.search.pojo.Item;
public interface ItemMapper
{
List<item>
getItemList();
}
|