1. 程式人生 > >solr學習筆記 -- day06 模擬京東實現站內搜尋

solr學習筆記 -- day06 模擬京東實現站內搜尋

一:功能分析

1、輸入條件

(1)、主條件查詢

(2)、根據商品分類名稱過濾

(3)、價格期間過濾

(4)、價格排序

(5)、分頁

2、返回結果

(1)、總記錄數

(2)、總頁數

(3)、商品列表,包括:商品圖片、商品標題、商品價格、關鍵詞高亮顯示

二:工程搭建

1、建立一個web工程

2、匯入jar包

        solrJ的jar包

        solrJ依賴的jar包

        日誌相關jar包

        springmvc相關jar包


3、框架整合

        只需要將springmvc整合如專案即可

(1)、專案整體


(2)、web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>jdsearch</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- POST提交過濾器 UTF-8 -->
	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>
</web-app>
(3)、springmvc.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">		

		<!-- 配置掃描 器 -->
		<context:component-scan base-package="com.itheima.jd"/>
		<!-- 配置處理器對映器  介面卡 -->
		<mvc:annotation-driven/>
		
		<!-- 配置檢視直譯器 jsp -->
		<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/WEB-INF/jsp/"/>
			<property name="suffix" value=".jsp"/>
		</bean>
		
		<!-- 初始化sqlServer物件 -->
		<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
			<constructor-arg index="0" value="http://localhost:8080/solr/collection1"/>
		</bean>
		
</beans>

三:pojo層

1、對應商品資訊建立一個Product物件

package com.itheima.jd.pojo;

public class Product {

	// 商品編號
	private String pid;
	// 商品名稱
	private String name;
	// 商品分類名稱
	private String catalog_name;
	// 價格
	private float price;
	// 圖片名稱
	private String picture;
	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCatalog_name() {
		return catalog_name;
	}
	public void setCatalog_name(String catalog_name) {
		this.catalog_name = catalog_name;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public String getPicture() {
		return picture;
	}
	public void setPicture(String picture) {
		this.picture = picture;
	}
	
}

2、建立查詢結果物件SearchResult

package com.itheima.jd.pojo;

import java.util.List;

public class SearchResult {

	private List<Product> productList;//結果集列表
	private long recordCount;//總記錄數
	private long pageCount;//總頁數

	public List<Product> getProductList() {
		return productList;
	}
	public void setProductList(List<Product> productList) {
		this.productList = productList;
	}
	public long getRecordCount() {
		return recordCount;
	}
	public void setRecordCount(long recordCount) {
		this.recordCount = recordCount;
	}
	public long getPageCount() {
		return pageCount;
	}
	public void setPageCount(long pageCount) {
		this.pageCount = pageCount;
	}
	
}

四:dao層

1、邏輯分析

(1)、執行查詢,得到查詢結果

(2)、取查詢結果的總記錄數

(3)、取商品列表,封裝到ProductList中

(4)、取高亮顯示的結果

(5)、返回SearchResult物件

2、程式碼實現

package com.itheima.jd.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.itheima.jd.pojo.Product;
import com.itheima.jd.pojo.SearchResult;

@Repository
public class SearchDao {

	@Autowired
	private SolrServer solrServer;
	
	public SearchResult search(SolrQuery query) throws Exception{
		//1.執行查詢,得到查詢結果
		QueryResponse queryResponse = solrServer.query(query);
		SolrDocumentList docList = queryResponse.getResults();
		//2.取查詢結果的總記錄數
		long count = docList.getNumFound();
		//3.取商品列表,封裝到productList中
		List<Product> list = new ArrayList<Product>();
		//4.取高亮顯示的結果
		Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
		for (SolrDocument doc : docList) {
			Product product = new Product();
			product.setCatalog_name((String) doc.get("product_catalog_name"));
			//取高亮結果
			List<String> list2 = highlighting.get(doc.get("id")).get("product_name");
			String name = "";
			if(list2 != null && list2.size() > 0){
				name = list2.get(0);
			}else{
				name = (String) doc.get("product_name");
			}
			product.setName(name);
			product.setPicture((String) doc.get("product_picture"));
			product.setPid((String) doc.get("id"));
			product.setPrice((float) doc.get("product_price"));
			list.add(product);
		}
		//5.返回SearchResult物件
		SearchResult result = new SearchResult();
		result.setProductList(list);
		result.setRecordCount(count);
		return result;
	}
}

3、在springmvc中配置初始化solrServer

		<!-- 初始化sqlServer物件 -->
		<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
			<constructor-arg index="0" value="http://localhost:8080/solr/collection1"/>
		</bean>

五:Servie層

1、引數分析:

a、主查詢條件                          String   queryString

b、根據商品分類名稱過濾       String   catalog_name

c、價格區間過濾                      String   price 

d、價格排序                              int   sort                          0:升序           1:降序

e、分頁                                     int    page                        頁碼從1開始,需要計算start,rows

2、返回值:

SearchResult

3、邏輯分析:

a、根據引數建立SolrQuery物件

b、呼叫dao執行查詢,可以得到SearchResult物件

c、取總記錄數

d、計算總頁數

e、返回SearchResult物件

4、程式碼實現

package com.itheima.jd.service;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.itheima.jd.dao.SearchDao;
import com.itheima.jd.pojo.SearchResult;

@Service
public class SearchService {

	//設定分頁中每頁顯示常量數
	private static Integer ROWS = 10;
	//注入dao
	@Autowired
	private SearchDao searchDao;
	
	/**
	 * 查詢業務邏輯
	 */
	public SearchResult search(String queryString, String catalog_name, String price,
								int sort, int page) throws Exception{
		//1.根據引數建立solrQuery物件
		SolrQuery query = new SolrQuery();
		//設定查詢條件
		if(queryString != null && !"".equals(queryString)){
			query.setQuery(queryString);
		}else{
			query.setQuery("*:*");
		}
		//根據商品分類名稱過濾查詢
		if(catalog_name != null && !"".equals(catalog_name)){
			query.addFilterQuery("product_catalog_name:" + catalog_name);
		}
		//根據價格區間過濾
		if(price != null && !"".equals(price)){
			String[] strs = price.split("-");
			query.addFilterQuery("product_price:[" + strs[0] + " TO " + strs[1] + "]");
		}
		//排序條件
		if(sort == 0){
			query.setSort("product_price",ORDER.asc);
		}else{
			query.setSort("product_price",ORDER.desc);
		}
		//分頁元件
		query.setStart((page - 1) * ROWS);
		query.setRows(ROWS);
		//設定預設搜尋域
		query.set("df","product_keywords");
		//開啟高亮顯示
		query.setHighlight(true);
		query.addHighlightField("product_name");//設定高亮欄位
		query.setHighlightSimplePre("<em style='color:red'>");//設定高亮字首
		query.setHighlightSimplePost("</em>");//設定高亮字尾 
		//2.呼叫dao查詢,獲取SearchResult物件
		SearchResult result = searchDao.search(query);
		//3.獲取總記錄數
		long recordCount = result.getRecordCount();
		//4.計算總頁數
		long pageCount = recordCount / ROWS;
		if(recordCount % ROWS > 0){
			pageCount ++;
		}
		result.setPageCount(pageCount);
		//5.返回SearchResult物件
		return result;
	}
}

六:controller層

package com.itheima.jd.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.itheima.jd.pojo.SearchResult;
import com.itheima.jd.service.SearchService;

@Controller
public class SearchController {

	@Autowired
	private SearchService searchService;
	
	@RequestMapping("list")
	public String search(String queryString, String catalog_name, String price,
					@RequestParam(defaultValue="1") Integer page,
					@RequestParam(defaultValue="1") Integer sort, Model model) throws Exception{
		//呼叫service進行查詢
		SearchResult result = searchService.search(queryString, catalog_name, price, sort, page);
		//回顯結果
		model.addAttribute("result",result);
		model.addAttribute("queryString",queryString);
		model.addAttribute("catalog_name",catalog_name);
		model.addAttribute("price",price);
		model.addAttribute("page",page);
		model.addAttribute("sort",sort);
		//返回邏輯檢視
		return "product_list";
	}
}

七:完成後的工程程式碼

url:http://pan.baidu.com/s/1gfgPIyn

相關推薦

solr學習筆記 -- day06 模擬京東實現搜尋

一:功能分析 1、輸入條件 (1)、主條件查詢 (2)、根據商品分類名稱過濾 (3)、價格期間過濾 (4)、價格排序 (5)、分頁 2、返回結果 (1)、總記錄數 (2)、總頁數 (3)、商品列表,包括:商品圖片、商品標題、商品價格、關鍵詞高亮顯示 二:工程搭建 1、建立一

用Google實現搜尋

           如果希望讓網站使用者搜尋自己網站上的內容,可以用Google的搜尋引擎來實現。 把如下Html程式碼新增到你的網站上,並且將Your Domain Name換成你的網站域名,就可以實現站內搜尋。實現的Html程式碼如下: <%@ Page Lan

python 學習筆記_2 模擬socket程式設計 服務端、客戶端通訊(參考核心程式設計2程式碼實現)

伺服器端程式碼實現: #!/usr/bin/env python#coding=gbk'''接收客戶端字串,在欄位串前面打上當前時間,然後返回server端採用 python2 linux下除錯執行客戶端採用python3 windows下除錯執行(注意編碼格式)''' from socket impor

Java學習筆記22:Java實現模擬使用者登入

package create; import java.util.Scanner; public class Test1_In { /* * 模擬使用者登入,僅有三次嘗試機會 */ public static void main(String[] args){ Scann

Solr學習筆記——導入JSON數據

管理 app 可能 pen ges nali fromfile mit print 1.導入JSON數據的方式有兩種,一種是在web管理界面中導入,另一種是使用curl命令來導入 curl http://localhost:8983/solr/baikeperson/up

[知了堂學習筆記]_Java代碼實現MySQL數據庫的備份與還原

數據庫名 dsw -o string data except 文件夾 user lock 通常在MySQL數據庫的備份和恢復的時候,多是采用在cmd中執行mysql命令來實現。     例如:     mysqldump -h127.0.0.1 -uroot -ppas

Ionic3學習筆記(十)實現夜間模式功能

gpa 效果 app code fff eat ext images provider 本文為原創文章,轉載請標明出處 目錄 創建主題樣式 導入 variables.scss 創建 provider 創建 page 在 App 入口處應用主題 效果圖 1. 創建主題樣式

【SSH學習筆記】用Struts2實現簡單的用戶登錄

utf-8 png rds href -a his ets 屬性 url 準備階段 在使用學習Struts2的時候首先要下載相應的架包 Struts2資源下載 這裏建議下載第一個,在struts-2.5.14.1-all.zip裏有很多實用的東西,不僅有架包還有官方為開發

spring框架學習筆記4:SpringAOP實現原理

odin 就是 sets 使用 point 攔截 ceo oca ssl AOP AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入

學習筆記CB012: LSTM 簡單實現、完整實現、torch、小說訓練word2vec lstm機器人

AS csdn 梯度下降 values 定義 方便 cto course sed 真正掌握一種算法,最實際的方法,完全手寫出來。 LSTM(Long Short Tem Memory)特殊遞歸神經網絡,神經元保存歷史記憶,解決自然語言處理統計方法只能考慮最近n個詞語而忽略更

Python學習筆記1:簡單實現ssh客戶端和服務端

bsp dev bre 客戶端 break 基於 bin listen 客戶 實現基於python 3.6。 server端: 1 __author__ = "PyDev2018" 2 3 import socket,os 4 server = socket.s

nginx學習筆記(一) 用nginx實現本地https請求轉http請求

error erro 需要 ror har file key media nginx代理 接到項目需求需要將一些https請求利用nginx代理到http接口上,因此要在本地上搭環境進行測試,現在將該過程記錄一下。 生成證書 1. 使用openssl生成密鑰privkey.

Python爬蟲學習筆記模擬登陸並爬去GitHub

過程 eight res 開發者工具 @value clas 之前 自己 8.0 (1)環境準備: 請確保已經安裝了requests和lxml庫 (2)分析登陸過程: 首先要分析登陸的過程,需要探究後臺的登陸請求是怎樣發送的,登陸之後又有怎樣的

Solr學習筆記(2)—— solr-7.0.0 安裝與目錄說明

導入 lms services pan conf nvi os x ins admin      一:Solr系統要求     您可以在任何系統中安裝 Solr,但是這些系統中必須有適用的 Java 運行時環境(JRE),具體介紹如下文所述。目前,這包括 Linux,Mac

Python學習筆記:bisect模組實現二分搜尋

  在Python中可以利用bisect模組來實現二分搜尋,該模組包含函式只有幾個: import bisect L = [1,3,4,5,5,5,8,10] x = 5 bisect.bisect_left(L,x) # 3 # 在L中查詢x,x存在時返回x最左側的位置,x不存在返回應該插入

Java多執行緒學習筆記(五) 使用Condition實現等待/通知

使用Condition實現等待/通知 1. 使用Condition 1.1 MyService 1.2 ThreadA 1.3 Test 1.4 執行結果 1.5 方法對比 2. 使用多個Condition實

Java多執行緒學習筆記(四) 使用ReentrantLock實現同步

1. 測試1 1.1 MyService import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MyService { pr

JUC學習筆記模擬CAS演算法——03

/*  * 模擬 CAS 演算法  */ public class TestCompareAndSwap {     public static void main(String[] args) {     &nbs

Solr學習筆記(三)-----SpringDataSolr操作

對solr伺服器進行訪問:本質上就是使用了http請求和響應,當我們訪問solr進行搜尋時,實質上就是傳送了一個http請求,如http://localhost:9080/solr/collection1/select?q=%3A&wt=json&indent=true

Solr學習筆記(二)

solr中文分析器的安裝配置: 1、IK Analyzer 是一個開源的,基亍 java 語言開發的輕量級的中文分詞工具包。從 2006年 12 月推出 1.0 版開始, IKAnalyzer 已經推出了 4 個大版本。最初,它是以開源專案Luence 為應用主體的,結合詞典分詞和文