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配置
(3)、springmvc.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>
<?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 為應用主體的,結合詞典分詞和文