第十一篇:基于Solr服務(wù)搭建搜索工程(前臺(tái))

前言:
上面我們已經(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)

image.png

image.png

2.功能分析

該首頁對(duì)應(yīng)的后臺(tái)代碼如下所示,在index.jsp當(dāng)中是沒有搜索相關(guān)代碼的玩徊,那么這部分代碼在哪兒呢租悄?其實(shí)是在header.jsp當(dāng)中


image.png

image.png

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)中潭辈。


image.png

記得把這個(gè)端口號(hào)改好
image.png

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)資源


image.png

2.添加pojo
我們到search.jsp頁面查看一下代碼,可以看到搜索頁面由總頁數(shù)totalPages和搜索出來的內(nèi)容列表itemList組成谅辣,而且可能會(huì)用到查詢總數(shù)量修赞。這些我們應(yīng)該放到一個(gè)pojo當(dāng)中


image.png
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ù)

image.png

接收層
在taotao-search-web中接收服務(wù)
image.png

請(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";
    }
}

翻頁處理


image.png

4.測(cè)試

啟動(dòng)相應(yīng)的工程(啟動(dòng)前記得更新依賴包);然后在taotao-manager-web中添加一些商品
(記得添加商品后惩淳,把商品列表添加到索引庫)


addTbitem.png

搜索結(jié)果.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕉毯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子黎泣,更是在濱河造成了極大的恐慌,老刑警劉巖缤谎,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抒倚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坷澡,警方通過查閱死者的電腦和手機(jī)托呕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人项郊,你說我怎么就攤上這事馅扣。” “怎么了着降?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵差油,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我任洞,道長(zhǎng)蓄喇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任交掏,我火速辦了婚禮妆偏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盅弛。我一直安慰自己钱骂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布挪鹏。 她就那樣靜靜地躺著阳谍,像睡著了一般笋粟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天氨肌,我揣著相機(jī)與錄音,去河邊找鬼斑鸦。 笑死刻帚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的创南。 我是一名探鬼主播伦忠,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼稿辙!你這毒婦竟也來了昆码?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤邻储,失蹤者是張志新(化名)和其女友劉穎赋咽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吨娜,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脓匿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宦赠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陪毡。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡米母,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毡琉,到底是詐尸還是另有隱情铁瞒,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布桅滋,位于F島的核電站慧耍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虱歪。R本人自食惡果不足惜蜂绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笋鄙。 院中可真熱鬧师枣,春花似錦、人聲如沸萧落。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兴革。三九已至,卻和暖如春蜜唾,著一層夾襖步出監(jiān)牢的瞬間擎勘,已是汗流浹背棚饵。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欣硼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像括授,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子版述,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言:上面我們已經(jīng)搭建好了Solr服務(wù)器吮龄,現(xiàn)在我們要利用這個(gè)Solr服務(wù)來搭建我們的搜素服務(wù)工程 1.創(chuàng)建搜索服務(wù)...
    __y閱讀 385評(píng)論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)毡们,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • 還是喜歡小時(shí)候花花草草的味道 一家人圍著吃飯的味道 曬的被子有太陽的味道 門口的小狗睡得很沉 那時(shí)候多好 沒有煩惱...
    小二不2閱讀 158評(píng)論 0 2
  • 最近在一場(chǎng)客戶交流中脖隶,分享了自己在數(shù)據(jù)服務(wù)行業(yè)總結(jié)的一個(gè)觀點(diǎn)产阱,那就是: 數(shù)據(jù)并不是商業(yè)最核心的王暗,數(shù)據(jù)思維才是撬動(dòng)商...
    逄格亮閱讀 346評(píng)論 0 0