第04項目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服務器搭建、搜索功能實現)

https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040html

第04項目:淘淘商城(SpringMVC+Spring+Mybatis) 的學習實踐總結【第五天】java

第04項目:淘淘商城(SpringMVC+Spring+Mybatis) 的學習實踐總結【第六天】mysql

第04項目:淘淘商城(SpringMVC+Spring+Mybatis)【第七天】(redis緩存)linux

第04項目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服務器搭建、搜索功能實現)web

 

第04項目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服務器搭建、搜索功能實現)


今天內容:redis

商品搜索功能:spring

一、使用solr實現。sql

二、搭建搜索服務層。數據庫

三、使用poratl調用搜索服務,實現商品搜索。express


在安裝使用solr前,須要先安裝並配置好jdk1.8.0和tomcat8.5在CentOS7.5虛擬機系統中。具體步驟詳情請見本文末尾的參考資料。

在VMware® 15Pro虛擬機中的CentOS7系統下安裝與配置Solr整合tomcat8.5與中文分詞器的使用

03.solr配置中文分析器及業務字段

啓動tomcat服務:

cd /usr/local/tomcat8.5/bin

./startup.sh

 

關閉tomcat服務:

cd /usr/local/tomcat8.5/bin

./shutdown.sh

 

瀏覽器訪問地址

http://192.168.179.128:8080/solr/index.html#/

04.索引庫的維護

05.solrJ維護索引庫

solrJ客戶端,此處使用7.7.2版本

<!-- solrJ客戶端 -->
<dependency>
  <groupId>org.apache.solr</groupId>
  <artifactId>solr-solrj</artifactId>
  <version>7.7.2</version>
</dependency>

HttpSolrClient solrServer = new HttpSolrClient.Builder("http://192.168.179.128:8080/solr/collection1").build();

package com.taotao.rest.jedis;

import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

public class SolrJTest {
    @Test
    public void addDocument() throws Exception {
        
        // https://www.cnblogs.com/jepson6669/p/9142676.html#headline1-11
        // 建立一鏈接,solr7的URL須要在solr/後面補全core的名稱
        HttpSolrClient solrServer = new HttpSolrClient.Builder("http://192.168.179.128:8080/solr/collection1").build();
        //建立一個文檔對象
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id", "test001");
        document.addField("item_title", "測試商品001");
        document.addField("item_price", 123456);
        //把文檔對象寫入索引庫
        solrServer.add(document);
        //提交
        solrServer.commit();
        //Solr中沒有update,只須要id一致覆蓋重寫便可
    }
    
    
    @Test
    public void deleteDocument() throws Exception {
        //建立一鏈接Solr4
        //SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        //建立一鏈接Solr7
        HttpSolrClient solrServer = new HttpSolrClient.Builder("http://192.168.179.128:8080/solr/collection1").build();
        //solrServer.deleteById("test001");
        solrServer.deleteByQuery("*:*");
        solrServer.commit();
    }



}
View Code

 

把商品信息導入到索引庫

使用java程序讀取mysql數據庫中的商品信息,而後建立solr文檔對象,把商品信息寫入索引庫。

須要發佈一個服務。

爲了靈活的進行分佈式部署須要建立一搜素的服務工程發佈 搜素服務。Taotao-search。

 

3.3    導入商品數據

3.3.1   須要使用的表

 

 

 

3.3.2   Sql語句

SELECT
    a.id,
    a.title,
    a.sell_point,
    a.price,
    a.image,
    b.`name` category_name,
    c.item_desc
FROM
    tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
LEFT JOIN tb_item_desc c ON a.id = c.item_id

3.3.3   Dao層

須要建立一個mapper接口+mapper映射文件。名稱相同且在同一目錄下。

package com.taotao.search.pojo;

public class Item {
    private String id;
    private String title;
    private String sell_point;
    private long price;
    private String image;
    private String category_name;
    private String item_des;

//==============================


}
View Code

 

 

 ItemMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.taotao.search.mapper.ItemMapper">

    <select id="getItemList"
        resultType="com.taotao.search.pojo.Item">
        SELECT
        a.id,
        a.title,
        a.sell_point,
        a.price,
        a.image,
        b.name category_name
        FROM
        tb_item a
        LEFT JOIN tb_item_cat b ON a.cid = b.id
    </select>

</mapper>

 

 applicationContext-solr.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    <!-- 掃描包加載Service實現類 -->
    <!-- 配置spring建立容器時,開啓註解要掃描的包,不掃描@Controller 註解的 JAVA 類-->
    <context:component-scan
        base-package="com.taotao.search.service" />

    <!-- 配置單機版7.7.2的Solr的HttpSolrClient對象 -->
    <bean id="httpSolrClient"  class="org.apache.solr.client.solrj.impl.HttpSolrClient">
        <constructor-arg name="builder"  value="${SOLR.SERVER.URL}"></constructor-arg>
    </bean>

</beans>

 

 solr.properties

#solr服務器虛擬機core地址的baseUrl
SOLR.SERVER.URL=http://192.168.179.128:8080/solr/collection1

 

Service層

@Service
public class ItemServiceImpl implements ItemService {

    @Value("SOLR.SERVER.URL")
    private String SOLR_SERVER_URL;
    
    @Autowired
    private ItemMapper itemMapper;

    @Autowired
    private HttpSolrClient httpSolrClient;

    @Override
    public TaotaoResult importAllItems() {
        

        
        try {
            // 查詢商品列表
            List<Item> list = itemMapper.getItemLsit();


            // 把商品信息寫入索引庫
            for (Item item : list) {
                // 建立一個SolrInputDocument對象
                SolrInputDocument document = new SolrInputDocument();
                document.setField("id", item.getId());
                document.setField("item_title", item.getTitle());
                document.setField("item_sell_point", item.getSell_point());
                document.setField("item_price", item.getPrice());
                document.setField("item_image", item.getImage());
                document.setField("item_category_name", item.getCategory_name());
                document.setField("item_desc", item.getItem_des());
                // 寫入索引庫
                httpSolrClient.add(document);
            }
            // 提交修改
            httpSolrClient.commit();

        } catch (Exception e) {
            e.printStackTrace();
            return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
        }

        return TaotaoResult.ok();
    }

}

 

java的web項目使用maven管理工程,要把src/main/java目錄下的package裏的.xml和.properties文件也編譯build

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>

 

3.3.5   Controller層

功能:發佈一個rest形式的服務。調用Service的服務方法,把數據導入到索引庫中,返回TaotaoResult。

Url:/search/manager/importall

 

 

 

@Controller
@RequestMapping("/manager")
public class ItemController {
    
    @Autowired
    private ItemService itemService;

    /**
     * 導入商品數據到索引庫
     */
    @RequestMapping("/importall")
    @ResponseBody
    public TaotaoResult importAllItems() {
        TaotaoResult result = itemService.importAllItems();
        return result;
    }
}

http://localhost:8083/search/manager/importall

 


 

4  搜索服務發佈

4.1    需求分析

http形式的服務。對外提供搜索服務是一個get形式的服務。調用此服務時須要查詢條件,分頁條件能夠使用page(要顯示第幾頁)、rows(每頁顯示的記錄數)。返回一個json格式的數據。能夠使用TaotaoResult包裝一個商品列表轉換成json。

請求的url:/search/query/{查詢條件}/{page}/{rows}

                  /search/query?q={查詢條件}&page={page}&rows={rows}

返回的結果:TaotaoResult包裝商品列表。

 

package com.taotao.common.pojo;

import java.util.List;


public class SearchResult {
    //商品列表
    private List<Item> itemList;
    //總記錄數
    private long recordCount;
    //總頁數
    private long pageCount;
    //當前頁
    private long curPage;

//==========get/set=======//

}

 

/**
 *   商品搜索DAO
 * @author kangy
 *
 */
@Repository //DAO層IOC註解
public class SearchDaoImpl implements SearchDao {
    
    @Autowired //在applicationContext-solr.xml裏注入對象
    private HttpSolrClient httpSolrClient; 

    @Override
    public SearchResult search(SolrQuery query) throws Exception {
        //new一個返回值對象
        SearchResult result = new SearchResult();
        //1.根據查詢條件查詢索引庫
        QueryResponse queryResponse = httpSolrClient.query(query); //2.取查詢結果
        SolrDocumentList solrDocumentList = queryResponse.getResults(); //3.1取查詢結果總數量
        result.setRecordCount(solrDocumentList.getNumFound());
        //new一個商品列表
        List<Item> itemList = new ArrayList<>();
        //取高亮顯示
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        //取商品列表
        for (SolrDocument solrDocument : solrDocumentList) { //new建立一商品對象
            Item item = new Item();
            item.setId((String) solrDocument.get("id"));
            //取高亮顯示的結果
            List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
            String title = "";
            if (list != null && list.size()>0) {
                title = list.get(0);
            } else {
                title = (String) solrDocument.get("item_title");
            }
            item.setTitle(title);
            item.setImage((String) solrDocument.get("item_image"));
            item.setPrice((long) solrDocument.get("item_price"));
            item.setSell_point((String) solrDocument.get("item_sell_point"));
            item.setCategory_name((String) solrDocument.get("item_category_name"));
            //把item的結果添加到商品列表
            itemList.add(item);
        }         //返回商品查詢結果集合
        result.setItemList(itemList);
        return result;
    }


}

 

4.3   Service層

功能:接收查詢條件。查詢條件及分頁條件(page、rows),建立一個SolrQuery對象。指定查詢條件、分頁條件、默認搜索域、高亮顯示。調用dao層執行查詢。獲得查詢結果計算總頁數。

返回SearchResult對象。

@Service
public class SearchServiceImpl implements SearchService {

    @Autowired
    private SearchDao searchDao;

    @Override
    public SearchResult search(String queryString, int page, int rows) throws Exception {
        // 建立查詢條件對象
        SolrQuery query = new SolrQuery();
        // 1.設置查詢條件
        query.setQuery(queryString);
        // 2.設置分頁        
        query.setRows(rows);
        query.setStart((page - 1) * rows);    
        // 3.設置默認搜索域
        query.set("df", "item_keywords");
        // 設置高亮顯示
        query.setHighlight(true);
        query.addHighlightField("item_title");
        query.setHighlightSimplePre("<em style=\"color:red\">");
        query.setHighlightSimplePost("</em>");
        // 4.執行查詢
        SearchResult searchResult = searchDao.search(query);
        // 5.計算查詢結果總頁數
        long recordCount = searchResult.getRecordCount();
        long pageCount = recordCount / rows;
        if (recordCount % rows > 0) {
            pageCount++;
        }
        searchResult.setPageCount(pageCount);
        searchResult.setCurPage(page);

        return searchResult;
    }

}
View Code

 

4.4   Controller層

接收查詢參數:查詢條件、page、rows

調用Service執行查詢返回一個查詢結果對象。

把查詢結果包裝到TaotaoResult中返回,結果是json格式的數據。

 

若是查詢條件爲空,返回狀態碼:400,消息:查詢條件不能爲空。

Page爲空:默認爲1

Rows 爲空:默認爲60

@Controller
public class SearchController {

    @Autowired
    private SearchService searchService;
    
    @GetMapping(value="/query")
    @ResponseBody
    public TaotaoResult search(@RequestParam("q")String queryString, 
            @RequestParam(defaultValue="1")Integer page, 
            @RequestParam(defaultValue="60")Integer rows) {
        //查詢條件不能爲空
        //commons.lang3.StringUtils
        if (StringUtils.isBlank(queryString)) {
            return TaotaoResult.build(400, "查詢條件不能爲空");
        }
        //com.taotao.common.pojo.SearchResult
        SearchResult searchResult = null;
        try {
            //解決get亂碼問題
            queryString = new String(queryString.getBytes("iso-8859-1"),"utf-8");
            searchResult = searchService.search(queryString, page, rows);
        } catch (Exception e) {
            e.printStackTrace();
            //com.taotao.common.utils.ExceptionUtil
            return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));        
        }
        return TaotaoResult.ok(searchResult);
        
    }
    
}

 

掃描dao的applicationContext-dao.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    <!--掃描包加載DAO層和Service層 -->
    <!-- 配置spring建立容器時,開啓註解要掃描的包,不掃描@Controller 註解的 JAVA 類-->
    <context:component-scan base-package="com.taotao.search">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

 

http://localhost:8083/search/query?q=手機

 

 

===============================================================

在VMware® Workstation 中的CentOS7系統虛擬機下安裝jdk-8u231-linux-x64.tar.gz

win10環境下使用VM15PRO虛擬機CentOS7系統下安裝tomcat8.5

拼音分析器的安裝 :https://www.cnblogs.com/jepson6669/p/9134652.html

 

未完待續。。。

相關文章
相關標籤/搜索