前言:
上面我們已經(jīng)實(shí)現(xiàn)了從數(shù)據(jù)庫中獲取數(shù)據(jù),然后一鍵導(dǎo)入索引庫中注簿。那么我們?nèi)绾卧谒阉鹘缑娅@取索引庫的信息呢契吉。下面開始介紹
1.創(chuàng)建taotao-search-web工程
我們知道京東是從首頁跳轉(zhuǎn)到搜索的界面,因此我們可以根據(jù)這個(gè)思路也創(chuàng)建一個(gè)搜索的前臺(tái)工程taotao-search-web滩援;
創(chuàng)建的步驟參考taotao-manager-web
打包方式war栅隐。
Taotao-search-web
記得改tomcat的端口號(hào)
2.功能分析
該首頁對(duì)應(yīng)的后臺(tái)代碼如下所示,在index.jsp當(dāng)中是沒有搜索相關(guān)代碼的玩徊,那么這部分代碼在哪兒呢租悄?其實(shí)是在header.jsp當(dāng)中
header.jsp頁面的代碼如下圖所示,可以看到在搜索框中輸入搜索搜索關(guān)鍵詞之后恩袱,點(diǎn)回車即可觸發(fā)search方法泣棋。但我們發(fā)現(xiàn)在整個(gè)header.jsp當(dāng)中并沒有search方法,那么search方法在哪兒呢畔塔?其實(shí)是在頁面引用的src="/js/base-v1.js"當(dāng)中潭辈。
記得把這個(gè)端口號(hào)改好
3.功能實(shí)現(xiàn)
我們從功能分析可以看出,當(dāng)我們從首頁輸入關(guān)鍵字的時(shí)候會(huì)跳到一個(gè)search.html的界面澈吨,同時(shí)也會(huì)也把關(guān)鍵字作為參數(shù)帶過去進(jìn)行查詢把敢;
1.在taotao-search-web工程中添加靜態(tài)資源
2.添加pojo
我們到search.jsp頁面查看一下代碼,可以看到搜索頁面由總頁數(shù)totalPages和搜索出來的內(nèi)容列表itemList組成谅辣,而且可能會(huì)用到查詢總數(shù)量修赞。這些我們應(yīng)該放到一個(gè)pojo當(dāng)中
public class SearchItemResult implements Serializable{
private long pageTotal;//總頁數(shù)
private long recordCount;//總數(shù)量
private List<SearchItem> searchList;//商品列表
public long getPageTotal() {
return pageTotal;
}
public void setPageTotal(long pageTotal) {
this.pageTotal = pageTotal;
}
public long getRecordCount() {
return recordCount;
}
public void setRecordCount(long recordCount) {
this.recordCount = recordCount;
}
public List<SearchItem> getSearchList() {
return searchList;
}
public void setSearchList(List<SearchItem> searchList) {
this.searchList = searchList;
}
}
Dao層
訪問索引庫的類。定義一些通用的數(shù)據(jù)訪問方法桑阶。
業(yè)務(wù)邏輯就是查詢索引庫柏副。
參數(shù):SolrQuery對(duì)象
業(yè)務(wù)邏輯:
1、根據(jù)Query對(duì)象進(jìn)行查詢蚣录。
2割择、返回查詢結(jié)果。List<SearchItem>萎河、查詢結(jié)果的總記錄數(shù)荔泳。
@Repository
public class SearchResultDao {
@Autowired
private SolrServer solrServer;
public SearchItemResult search(SolrQuery query)throws Exception {
//根據(jù)query對(duì)象進(jìn)行查詢
QueryResponse response = solrServer.query(query);
//取查詢結(jié)果(商品列表)
SolrDocumentList solrDocumentList = response.getResults();
List<SearchItem> searchItemList = new ArrayList<>();
for (SolrDocument solrDocument:solrDocumentList) {
SearchItem item = new SearchItem();
item.setId((String) solrDocument.get("id"));
item.setCategory_name((String) solrDocument.get("item_category_name"));
String images = (String) solrDocument.get("item_image");
if(StringUtils.isNotBlank(images)) {
images = images.split(",")[0];
}
item.setImage(images);
item.setPrice((long) solrDocument.get("item_price"));
item.setSell_point((String) solrDocument.get("item_sell_point"));
//取高亮顯示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String itemTitle = "";
//有高亮顯示的內(nèi)容時(shí)蕉饼。
if (list != null && list.size() > 0) {
itemTitle = list.get(0);
} else {
itemTitle = (String) solrDocument.get("item_title");
}
item.setTitle(itemTitle);
//添加到商品列表
searchItemList.add(item);
}
SearchItemResult searchItemResult = new SearchItemResult();
//取總記錄數(shù)
searchItemResult.setRecordCount(solrDocumentList.getNumFound());
searchItemResult.setSearchList(searchItemList);
return searchItemResult;
}
}
Service層
參數(shù):queryString:查詢條件
Page:頁碼
Rows:每頁顯示的記錄數(shù)。
業(yè)務(wù)邏輯:
1换可、創(chuàng)建一個(gè)SolrQuery對(duì)象椎椰。
2、設(shè)置查詢條件
3沾鳄、設(shè)置分頁條件
4慨飘、需要指定默認(rèn)搜索域。
5译荞、設(shè)置高亮
6瓤的、執(zhí)行查詢,調(diào)用SearchDao吞歼。得到SearchResult
7圈膏、需要計(jì)算總頁數(shù)。
8篙骡、返回SearchResult
返回值:SearchResult
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchResultDao searchResultDao;
public SearchItemResult search(String queryString, Integer page, Integer rows) throws Exception {
//創(chuàng)建一個(gè)SolrQuery對(duì)象
SolrQuery solrQuery = new SolrQuery();
//設(shè)置查詢條件
solrQuery.setQuery(queryString);
//設(shè)置分頁條件
solrQuery.setStart((page - 1) * rows);
solrQuery.setRows(rows);
//指定默認(rèn)的搜索域
solrQuery.set("df", "item_title");
//設(shè)置高亮
solrQuery.setHighlight(true);
solrQuery.addHighlightField("item_title");
solrQuery.setHighlightSimplePre("<em style=\"color:red\">");
solrQuery.setHighlightSimplePost("</em>");
//執(zhí)行查詢稽坤,調(diào)用searchResultDao得到SearchResult
SearchItemResult searchItemResult = searchResultDao.search(solrQuery);
//需要計(jì)算總頁數(shù)
long pageTotal = searchItemResult.getRecordCount()/rows;
if(searchItemResult.getRecordCount() % rows > 0) {
pageTotal++;
}
searchItemResult.setPageTotal(pageTotal);
//返回SearchResult
return searchItemResult;
}
}
發(fā)布服務(wù)
接收層
在taotao-search-web中接收服務(wù)
請(qǐng)求的url:/search
參數(shù):
1、q 查詢條件糯俗。
2尿褪、page 頁碼。默認(rèn)為1
返回值:
邏輯視圖得湘,返回值杖玲。String。
業(yè)務(wù)邏輯:
1淘正、接收參數(shù)
2摆马、調(diào)用服務(wù)查詢商品列表
3、把查詢結(jié)果傳遞給頁面鸿吆。需要參數(shù)回顯囤采。
@Controller
public class SearcController {
private final static Integer rows = 60;//行數(shù)s
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private SearchService searchService;
@RequestMapping("/search")
public String search(@RequestParam("q") String queryString,
@RequestParam(defaultValue = "1") Integer page,Model model) throws Exception{
queryString = new String(queryString.getBytes("iso8859-1"),"utf-8");
SearchItemResult result = searchService.search(queryString,page,rows);
//傳遞給界面
model.addAttribute("query",queryString);
model.addAttribute("totalPages",result.getPageTotal());
model.addAttribute("itemList",result.getSearchList());
model.addAttribute("page",page);
//返回邏輯視圖
return "search";
}
}
翻頁處理
4.測(cè)試
啟動(dòng)相應(yīng)的工程(啟動(dòng)前記得更新依賴包);然后在taotao-manager-web中添加一些商品
(記得添加商品后惩淳,把商品列表添加到索引庫)