备注:学习Solr最好先了解一下Lucene的基本内容,不需要很熟,但是知道个基础即可。

一:Solr简介
       Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Solr是一个高性能,采用Java5开发,

基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎
二:Solr服务器的搭建
步骤:

(1)在磁盘中创建一个文件目录,即认为该文件为Solr服务器的相关属性。

(2)在上述的文件目录中,复制一个Tomcat服务器(最好是纯净的,即webapps目录下不包含多余的项目)

(3)从lucene.apache.org官网或者其他资源网下载Solr资源(由于Solr目前更新都很频繁,差不多是两个月就有新版本,而且对于Solr4和Solr5之间存在着不同,所以这个根据需要下载版本吧。我用的是Solr4版本中的4.10.3版本)

(4)将下载的solr中,进入下图的目录,然后将war包拷贝到Tomcat中的webapps下面

(5)解压拷贝过去的war包,并将解压完成之后,将之前的war包进行删除,原因就是我们需要修改解压的内容,否则不删除,在部署之后又会覆盖,所以要进行删除处理。

(6)从下载好的solr中的下面的目录,将jar包拷贝到Tomcat下的solr中的lib目录

(7)创建一个Solr服务器的核心家文件夹,并将其与tomcat保持同级。

(8)修改tomcat目录webapps下的solr的web.xml文件内容,修改solr核心家的内容

(9)运行tomcat

(10)运行成功后,访问链接http://localhost:8080/solr     即可进入到solr服务器的首页。

三:Solr服务器配置中文分词器

步骤:

(1)拷贝中文分词器IK分词包到Solr服务中的lib目录中

(2)在Solr中的WEB-INF下面创建classes文件目录,用于存放中文分词器的分词配置

ext.dic的内容,比如如下:

高富帅
黑马程序员
二维表

这样的话,碰到这样的词就不会进行拆分了,所以,一些网络新词就可以在这里进行配置。

IKAnalyer.cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>  <comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">ext.dic;</entry> <!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">stopword.dic;</entry> </properties>

stopwords.dic内容:

我
是
的
a
an
and
are
as

这样的话,对于上面的字就不会进行显示处理了,因为这些都是没有意义的词汇。

(3)在核心solr家中,找到配置文件schema.xml,添加中文分词器的配置。

添加如下内容:

<!--配置中文分词器--><fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType><!--配置几个域,这几个就支持中文分词了,当然自己根据需求进行创建即可--><field name="title_ik" type="text_ik" indexed="true" stored="true"/><field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/

(4)重启tomcat,进行测试是否配置完成。

(5)访问Solr主页,进行测试

四:配置solr服务器导入数据库数据
步骤:

(1)导包

首先是需要在solr的核心库中添加一些导入数据的包,需要如下:

注意:因为在collection中,最初是没有lib这个文件目录的,所以需要自己创建一个lib目录,然后把相应的jar包添加进去。

(2)在collection中的config目录下的solrconfig.xml中添加数据导入处理器

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"><lst name="defaults"><str name="config">data-config.xml</str></lst></requestHandler>

(3)在collection中的config目录添加一个data-config.xml(这个与上面一步配置的名字要相同)

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/需要导入数据的数据库名"user="数据库账号"password="数据库密码"/>
<document><entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products"><field column="pid" name="id" /><field column="name" name="product_name" /><field column="catalog_name" name="product_catalog_name" /><field column="price" name="product_price" /><field column="description" name="product_description" /><field column="picture" name="product_picture" /></entity>
</document>
</dataConfig>

备注:上面的内容,其实一看就大体明白了什么意思,主要就是配置要导入哪个数据库,导入的字段有什么,如果不配置的话,那么solr服务器是无法判断得到的字段的,所以需要进行配置,相当于一个映射配置。

注意:我上面的entity里面的内容就是我需要导入数据的字段的些内容,所以,根据需求进行自行匹配。

(4)在collection中config目录下的schema.xml添加如下内容:(这个是为了能够便于对导入数据库中的数据,与solr中的域进行匹配,因为我们都知道,如果solr域中不存在相应的域,那么是无法进行查询修改删除操作的,那么就不利于我们在以后的项目中对数据库相应字段的处理,所以,这一步是可有可无,但是配置了就有很多的好处)

<!--配置从数据库导入到sorl中的数据的字段内容,所以每次要从数据库导入什么就需要配置什么--><field name="product_name" type="text_ik" indexed="true" stored="true"/><field name="product_price" type="float" indexed="true" stored="true"/><field name="product_description" type="text_ik" indexed="true" stored="false"/><field name="product_picture" type="string" indexed="false" stored="true"/><field name="product_catalog_name" type="string" indexed="true" stored="true"/><field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true" /><copyField source="product_name" dest="product_keywords" /><copyField source="product_description" dest="product_keywords" />

(5)重启tomcat,然后登陆solr服务

(6)进行添加数据的处理

(7)点击上面图中的Execute按钮即可进行数据的导入了,然后再进去Query就可查询到导入的数据了哦!!

五:SolrJ进行数据的增删改查的处理

package com.hnu.scw.solr;
import java.io.IOException;
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.SolrServerException;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
/*** solrj的相关开发* @author scw*2018-02-26*/
public class SolrManager {/*** 添加文档数据到solr服务器中* @throws Exception*/@Testpublic void addContent() throws Exception{//设置solr服务器的路径,默认是使用第一个collection库,所以路径最后可以不加collection1String baseURL = "http://localhost:8080/solr";//如果要使用第二个collection库,那么就使用下面的链接//String baseURL2 = "http://localhost:8080/solr/collection2";      //创建服务器连接对象HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);//创建新的文档对象SolrInputDocument solrInputDocument = new SolrInputDocument();//设置文档的域solrInputDocument.setField("id", "haha222");solrInputDocument.setField("name", "佘超伟123");//进行添加httpSolrServer.add(solrInputDocument);//进行手动提交,否则无法进行添加httpSolrServer.commit();}/*** 进行删除文档操作* @throws SolrServerException* @throws IOException*/@Testpublic void deleteContent() throws Exception{String baseURL = "http://localhost:8080/solr";SolrServer httpSolrServer = new HttpSolrServer(baseURL);//删除全部,第一个参数是设置需要删除的数据的域和值,第二个是执行后多久进行删除操作//httpSolrServer.deleteByQuery("*:*",1000);//删除某个特定域的特定值的数据httpSolrServer.deleteByQuery("id:haha",1000);}/*** 修改文档内容* 修改其实和添加是一样的,因为只要添加的ID是一样的,那么就会把原来的删除了,然后再添加一个* @throws IOException * @throws SolrServerException */@Testpublic void updateContent() throws SolrServerException, IOException{String baseURL = "http://localhost:8080/solr";SolrServer httpSolrServer = new HttpSolrServer(baseURL);//创建新的文档对象SolrInputDocument solrInputDocument = new SolrInputDocument();//设置文档的域solrInputDocument.setField("id", "haha123");solrInputDocument.setField("name", "哈哈123");httpSolrServer.add(solrInputDocument);}/*** 查询数据(多功能的显示处理)* @throws Exception */@Testpublic void queryContent() throws Exception{String baseURL = "http://localhost:8080/solr";SolrServer httpSolrServer = new HttpSolrServer(baseURL);//创建查询数据对象(便于设置查询条件)SolrQuery solrQuery = new SolrQuery();//设置查询的域和值,这个在之后的项目中可以用于动态//方法一:参数q就代表query查询//solrQuery.set("q","name:佘超伟123");//方法二:(一般使用该方法)solrQuery.setQuery("name:佘超伟");//方法三:通过设置默认域//solrQuery.set("df", "name");//solrQuery.setQuery("佘超伟");//设置查询过滤条件(可以设置多个,只要域和值有改变就可以了)//solrQuery.set("fq", "id:haha123");//添加排序方式(可选内容)//solrQuery.addSort("需要排序的域",ORDER.asc);//升序//solrQuery.addSort("需要排序的域",ORDER.desc);//降序//设置分页处理(比如这是设置每次显示5个)solrQuery.setStart(0);solrQuery.setRows(5);//设置只查询显示指定的域和值(第二个参数可以是多个,之间用“逗号”分割)//solrQuery.set("fl", "name");//设置某域进行高亮显示solrQuery.setHighlight(true);solrQuery.addHighlightField("name");//设置高亮显示格式的前后缀solrQuery.setHighlightSimplePre("<span style='color:red'>");solrQuery.setHighlightSimplePost("</span"); //执行查询,获得查询结果对象QueryResponse query = httpSolrServer.query(solrQuery);//获取查询的结果集SolrDocumentList results = query.getResults();//获取高亮显示的查询结果//注意点:因为高亮的结果和正常的查询结果是不一样的,所以要进行特别的处理Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();//遍历结果集for (SolrDocument solrDocument : results) {String idStr = (String) solrDocument.get("id");System.out.println("id----------------" + idStr);String nameStr = (String) solrDocument.get("name");System.out.println("name----------------" + nameStr);System.out.println("===========高亮显示=====================");Map<String, List<String>> map = highlighting.get(idStr);List<String> list = map.get("name");String resultString = list.get(0);System.out.println("高亮结果为:-----" + resultString);}     }
}

六:Solr服务器中的后台数据的增删改查处理
这个其实就类似SolrJ的代码,代码看懂的话,这个后台操作是一样的,而且不需要进行代码处理,相对更加方便,但是对于实际的项目开发中,这样肯定是不好的,所以还是需要通过代码进行编写更为有效。

七:京东商城的站内搜索项目实践
效果图:

步骤:

(1)环境搭建-------SpringMVC+Solr+mysql

1:导包------Springmvc+Solr+数据库驱动的jar包

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>JingDongSolr</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提交防止乱码 --><filter><filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置springmvc前端控制器 --><servlet><servlet-name>JingDongSolr</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>JingDongSolr</servlet-name><url-pattern>/</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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- 扫描基本包  @Controller  @Service @Respostory --><context:component-scan base-package="com.hnu.scw"/><!-- 三大组件 --><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!-- 对静态资源文件的访问  restful-->     <mvc:resources mapping="/images/**" location="/images/" /><mvc:resources mapping="/resource/**" location="/resource/" /><!-- 配置SolrJ --><bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer"><constructor-arg value="http://localhost:8080/solr/collection1"/></bean></beans>

4:编写jsp,css,js和添加需要的图片资源

product_list.jsp-------------显示商品信息,即主页

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<!-- saved from url=(0047)http://list.jd.com/list.html?cat=1315,1343,1355 -->
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="utf-8" http-equiv="charset">
<link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/base.css" media="all">
<link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/plist20131112.css" media="all">
<link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/list-page-20141009.css" media="all">
<link rel="stylesheet" type="text/css"href="<c:url value='/resource'/>/pop_compare.css" media="all">
<link rel="shortcut icon" type="image/ico"href="http://list.jd.com/favicon.ico">
<script type="text/javascript"src="<c:url value='/resource'/>/jquery-1.2.6.pack.js"></script>
<style id="style-1-cropbar-clipper">/* Copyright 2014 Evernote Corporation. All rights reserved. */
.en-markup-crop-options {top: 18px !important;left: 50% !important;margin-left: -100px !important;width: 200px !important;border: 2px rgba(255,255,255,.38) solid !important;border-radius: 4px !important;
}.en-markup-crop-options div div:first-of-type {margin-left: 0px !important;
}
</style>
<script type="text/javascript">function query() {//执行关键词查询时清空过滤条件document.getElementById("catalog_name").value="";document.getElementById("price").value="";//执行查询queryList();}function queryList() {//提交表单document.getElementById("actionForm").submit();}function filter(key, value) {document.getElementById(key).value=value;//执行查询queryList();}function sort() {var s = document.getElementById("sort").value; if (s != "1") {s = "1";} else {s = "0";}document.getElementById("sort").value = s;//执行查询queryList();}
</script>
</head>
<body class="root61">
<div id="shortcut-2013"><div class="w"><ul class="fl lh"><li class="fore1 ld"><b></b><a href="#" rel="nofollow">收藏京东</a></li></ul><ul class="fr lh"><li class="fore1" id="loginbar">您好,欢迎来到京东!<span><a href="#">[登录]</a> <a href="#" class="link-regist">[免费注册]</a></span></li><li class="fore2 ld"><s></s><a href="#" rel="nofollow">我的订单</a></li><li class="fore2-1 ld" id="jd-vip"><i></i><i></i><s></s><a target="_blank" rel="nofollow" href="http://vip.jd.com/">会员俱乐部</a></li><li class="fore2-2 ld" id="jd-dakehu">        <i></i><s></s>        <a href="http://b.jd.com/" target="_blank" rel="nofollow">企业频道</a>    </li><li class="fore3 ld menu" id="app-jd" data-widget="dropdown" clstag="homepage|keycount|home2013|01d"><s></s><i></i><span class="outline"></span><span class="blank"></span><a href="http://app.jd.com/" target="_blank">手机京东</a><b></b></li><li class="fore4 ld menu" id="biz-service" data-widget="dropdown"><s></s><span class="outline"></span><span class="blank"></span>客户服务<b></b></li><li class="fore5 ld menu" id="site-nav" data-widget="dropdown"><s></s><span class="outline"></span><span class="blank"></span>网站导航<b></b></li></ul><span class="clr"></span></div>
</div><!--shortcut end-->
<div id="o-header-2013"><div class="w" id="header-2013"><div id="logo-2013" class="ld"><a href="http://www.jd.com/" hidefocus="true"><b></b><img src="<c:url value='/resource'/>/logo-201305.png" width="270" height="60" alt="京东"></a></div><!--logo end--><div id="search-2013"><div class="i-search ld"><ul id="shelper" class="hide"></ul><form id="actionForm" action="${pageContext.request.contextPath}/list" method="POST"><div class="form"><input type="text" class="text" accesskey="s" name="queryString" id="key" value="${queryString }"autocomplete="off" onkeydown="javascript:if(event.keyCode==13) {query()}"><input type="button" value="搜索" class="button" onclick="query()"></div><input type="hidden" name="catalog_name" id="catalog_name" value="${catalog_name }"/> <input type="hidden" name="price" id="price" value="${price }"/> <input type="hidden" name="sort" id="sort" value="${sort }"/> </form></div><div id="hotwords"></div></div><!--search end--><div id="my360buy-2013"><dl><dt class="ld"><s></s><a href="http://home.jd.com/">我的京东</a><b></b></dt><dd><div class="loading-style1"><b></b>加载中,请稍候...</div></dd></dl></div><!--my360buy end--><div id="settleup-2013"><dl><dt class="ld"><s></s><span class="shopping"><span id="shopping-amount">0</span></span><a href="http://cart.jd.com/cart/cart.html" id="settleup-url">去购物车结算</a> <b></b> </dt><dd><div class="prompt"><div class="loading-style1"><b></b>加载中,请稍候...</div></div></dd></dl></div><!--settleup end--></div><!--header end--><div class="w"><div id="nav-2013"><div id="categorys-2013" class="categorys-2014"><div class="mt ld"><h2><a href="http://www.jd.com/allSort.aspx">全部商品分类<b></b></a></h2></div></div><div id="treasure"></div><ul id="navitems-2013"><li class="fore1" id="nav-home"><a href="http://www.jd.com/">首页</a></li><li class="fore2" id="nav-fashion"><a href="http://fashion.jd.com/">服装城</a></li><li class="fore3" id="nav-chaoshi"><a href="http://channel.jd.com/chaoshi.html">食品</a></li><li class="fore4" id="nav-tuan"><a href="http://tuan.jd.com/" target="_blank">团购</a></li><li class="fore5" id="nav-auction"><a href="http://auction.jd.com/">夺宝岛</a></li><li class="fore6" id="nav-shan"><a href="http://red.jd.com/">闪购</a></li><li class="fore7" id="nav-jinrong"><a href="http://jr.jd.com/" target="_blank">金融</a></li></ul></div></div>
</div>
<div class="w"><div class="breadcrumb"><strong><a href="#">服饰内衣</a></strong><span> > <ahref="#">女装</a> > <a href="#">T恤</a></span></div>
</div>
<div class="w main">
<div class="right-extra">
<div id="select" clstag="thirdtype|keycount|thirdtype|select" class="m"><div class="mt"><h1>T恤 -<strong> 商品筛选</strong></h1></div><div class="mc attrs"><div data-id="100001" class="brand-attr"><div class="attr"><div class="a-key">商品类别:</div><div class="a-values"><div class="v-tabs"><div class="tabcon"><div><a href="javascript:filter('catalog_name', '幽默杂货')" >幽默杂货</a></div><div><a href="javascript:filter('catalog_name', '时尚卫浴')">时尚卫浴</a></div><div><a href="javascript:filter('catalog_name', '另类文体')">另类文体</a></div><div><a href="javascript:filter('catalog_name', '创意相架')">创意相架</a></div><div><a href="javascript:filter('catalog_name', '巧妙收纳')">巧妙收纳</a></div><div><a href="javascript:filter('catalog_name', '与钟不同')">与钟不同</a></div><div><a href="javascript:filter('catalog_name', '个性男人')">个性男人</a></div><div><a href="javascript:filter('catalog_name', '电脑周边')">电脑周边</a></div><div><a href="javascript:filter('catalog_name', '品质家电')">品质家电</a></div>                                            <div>                                             <a href="javascript:filter('catalog_name', '品味茶杯')">品味茶杯</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '四季用品')">四季用品</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '健康宝宝')">健康宝宝</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '新潮美容')">新潮美容</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '产品配件')">产品配件</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '雅致灯饰')">雅致灯饰</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '阳光车饰')">阳光车饰</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '趣味纸抽')">趣味纸抽</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '布艺毛绒')">布艺毛绒</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '益智手工')">益智手工</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '环保餐具')">环保餐具</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '闪亮匙扣')">闪亮匙扣</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '手机饰品')">手机饰品</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '精品数码')">精品数码</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '理财钱罐')">理财钱罐</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '美味厨房')">美味厨房</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '保健按摩')">保健按摩</a></div>                                             <div>                                             <a href="javascript:filter('catalog_name', '魅力女人')">魅力女人</a></div></div></div></div></div></div><div data-id="100002" class="prop-attrs"><div class="attr"><div class="a-key">价格:</div><div class="a-values"><div class="v-fold"><ul class="f-list"><li><a href="javascript:filter('price','0-9')">0-9</a></li><li><a href="javascript:filter('price','10-19')">10-19</a></li><li><a href="javascript:filter('price','20-29')">20-29</a></li><li><a href="javascript:filter('price','30-39')">30-39</a></li><li><a href="javascript:filter('price','40-49')">40-49</a></li><li><a href="javascript:filter('price','50-*')">50以上</a></li></ul></div></div></div></div></div>
</div>
<div id="filter"><div class="cls"></div><div class="fore1"><dl class="order"><dt>排序:</dt><dd><a href="javascript:sort()">价格</a><b></b></dd></dl><dl class="activity"><dd></dd></dl><div class="pagin pagin-m"><span class="text"><i>1</i>/200</span><a href="javascript:;" class="prev">上一页<b></b></a><a href="javascript:;" class="next">下一页<b></b></a></div><div class="total"><span>共<strong>2000</strong>个商品</span></div><span class="clr"></span></div>
</div>
<!--商品列表开始-->
<div id="plist" class="m plist-n7 plist-n8 prebuy"><ul class="list-h"><c:forEach var="item" items="${productModels }"><li pid="${item.pid }"><div class="lh-wrap"><div class="p-img"><a target="_blank" href="#"><img width="220" height="282" class="err-product" src="data:images/${item.picture}"></a></div><div class="p-name"><a target="_blank" href="#">${item.name }</a></div><div class="p-price"><strong>¥<fmt:formatNumber value="${item.price}" maxFractionDigits="2"/></strong><span id="p1269191543"></span></div></div></li></c:forEach></ul>
</div>
<!--商品列表结束-->
</div>
<div class="left"><div id="sortlist" clstag="thirdtype|keycount|thirdtype|sortlist"class="m"><div class="mt"><h2>服饰内衣</h2></div><div class="mc"><div class="item current"><h3><b></b>女装</h3><ul><li><a href="http://list.jd.com/1315-1343-1355.html">T恤</a></li><li><a href="http://list.jd.com/1315-1343-1354.html">衬衫</a></li><li><a href="http://list.jd.com/1315-1343-1356.html">针织衫</a></li><li><a href="http://list.jd.com/1315-1343-9713.html">雪纺衫</a></li><li><a href="http://list.jd.com/1315-1343-9710.html">卫衣</a></li><li><a href="http://list.jd.com/1315-1343-9714.html">马甲</a></li><li><a href="http://list.jd.com/1315-1343-9719.html">连衣裙</a></li><li><a href="http://list.jd.com/1315-1343-9720.html">半身裙</a></li><li><a href="http://list.jd.com/1315-1343-9715.html">牛仔裤</a></li><li><a href="http://list.jd.com/1315-1343-9717.html">休闲裤</a></li><li><a href="http://list.jd.com/1315-1343-9716.html">打底裤</a></li><li><a href="http://list.jd.com/1315-1343-9718.html">正装裤</a></li><li><a href="http://list.jd.com/1315-1343-9711.html">小西装</a></li><li><a href="http://list.jd.com/1315-1343-9712.html">短外套</a></li><li><a href="http://list.jd.com/1315-1343-9708.html">风衣</a></li><li><a href="http://list.jd.com/1315-1343-9706.html">毛呢大衣</a></li><li><a href="http://list.jd.com/1315-1343-9707.html">真皮皮衣</a></li><li><a href="http://list.jd.com/1315-1343-9705.html">棉服</a></li><li><a href="http://list.jd.com/1315-1343-3983.html">羽绒服</a></li><li><a href="http://list.jd.com/1315-1343-9722.html">大码女装</a></li><li><a href="http://list.jd.com/1315-1343-9721.html">中老年女装</a></li><li><a href="http://list.jd.com/1315-1343-9723.html">婚纱</a></li><li><a href="http://list.jd.com/1315-1343-11985.html">打底衫</a></li><li><a href="http://list.jd.com/1315-1343-11986.html">旗袍/唐装</a></li><li><a href="http://list.jd.com/1315-1343-11987.html">加绒裤</a></li><li><a href="http://list.jd.com/1315-1343-11988.html">吊带/背心</a></li><li><a href="http://list.jd.com/1315-1343-11989.html">羊绒衫</a></li><li><a href="http://list.jd.com/1315-1343-11991.html">短裤</a></li><li><a href="http://list.jd.com/1315-1343-11993.html">皮草</a></li><li><a href="http://list.jd.com/1315-1343-11996.html">礼服</a></li><li><a href="http://list.jd.com/1315-1343-11998.html">仿皮皮衣</a></li><li><a href="http://list.jd.com/1315-1343-11999.html">羊毛衫</a></li><li><a href="http://list.jd.com/1315-1343-12000.html">设计师/潮牌</a></li></ul></div><div class="item"><h3><b></b>男装</h3></div><div class="item"><h3><b></b>内衣</h3></div><div class="item"><h3><b></b>服饰配件</h3></div></div></div><div id="limitBuy"><div id="limitbuy9199"clstag="thirdtype|keycount|thirdtype|limitbuy536"class="m limitbuy hide"><div class="mt"><h2>服饰鞋帽</h2></div><div class="mc"><div id="clock9199" class="clock">正在加载…</div><div id="limit9199"></div></div></div></div><div id="ad_left" reco_id="6" class="m m0 hide"></div><!--用户最终购买--><div id="finalbuy" class="hide m m0" style="display: block;"><div class="mt"><h2>浏览<font color="red">T恤</font>最终购买</h2></div><div class="mc"></div></div><div id="weekRank" clstag="thirdtype|keycount|thirdtype|mrank"class="m rank"><div class="mt"><h2>一周销量排行</h2></div><div class="mc"></div></div>
</div><!--<div class="left">--><span class="clr"></span>
<div id="Collect_Tip" class="Tip360 w260"></div></div><!--<div class="w main">--><div class="w"><div id="service-2013"><dl class="fore1"><dt><b></b><strong>购物指南</strong></dt><dd><div><a href="http://help.jd.com/help/question-56.html" target="_blank" rel="nofollow">购物流程</a></div><div><a href="http://help.jd.com/help/question-57.html" target="_blank" rel="nofollow">会员介绍</a></div><div><a href="http://help.jd.com/help/question-181.html" target="_blank" rel="nofollow">团购/机票</a></div><div><a href="http://help.jd.com/help/question-61.html" target="_blank" rel="nofollow">常见问题</a></div><div><a href="http://help.jd.com/help/question-63.html" target="_blank" rel="nofollow">大家电</a></div><div><a href="http://help.jd.com/index.html" target="_blank" rel="nofollow">联系客服</a></div></dd></dl><dl class="fore2"><dt><b></b><strong>配送方式</strong></dt><dd><div><a href="http://help.jd.com/help/question-64.html" target="_blank" rel="nofollow">上门自提</a></div><div><a href="http://help.jd.com/help/question-360.html" target="_blank" rel="nofollow">211限时达</a></div><div><a href="http://help.jd.com/help/distribution-768.html" target="_blank" rel="nofollow">配送服务查询</a></div><div><a href="http://help.jd.com/help/question-892.html#help2215" target="_blank" rel="nofollow">配送费收取标准</a></div><div><a href="http://en.jd.com/chinese.html" target="_blank">海外配送</a></div></dd></dl><dl class="fore3"><dt><b></b><strong>支付方式</strong></dt><dd><div><a href="http://help.jd.com/help/question-67.html" target="_blank" rel="nofollow">货到付款</a></div><div><a href="http://help.jd.com/help/question-68.html" target="_blank" rel="nofollow">在线支付</a></div><div><a href="http://help.jd.com/help/question-71.html" target="_blank" rel="nofollow">分期付款</a></div><div><a href="http://help.jd.com/help/question-69.html" target="_blank" rel="nofollow">邮局汇款</a></div><div><a href="http://help.jd.com/help/question-70.html" target="_blank" rel="nofollow">公司转账</a></div></dd></dl><dl class="fore4"><dt><b></b><strong>售后服务</strong></dt><dd><div><a href="http://myjd.jd.com/afs/help/afshelp.action" target="_blank" rel="nofollow">售后政策</a></div><div><a href="http://help.jd.com/help/question-99.html" target="_blank" rel="nofollow">价格保护</a></div><div><a href="http://help.jd.com/help/question-100.html" target="_blank" rel="nofollow">退款说明</a></div><div><a href="http://myjd.jd.com/repair/repairs.action" target="_blank" rel="nofollow">返修/退换货</a></div><div><a href="http://help.jd.com/help/question-881.html" target="_blank" rel="nofollow">取消订单</a></div></dd></dl><dl class="fore5"><dt><b></b><strong>特色服务</strong></dt><dd><div><a href="http://help.jd.com/help/question-79.html" target="_blank">夺宝岛</a></div><div><a href="http://help.jd.com/help/question-86.html" target="_blank">DIY装机</a></div><div><a href="http://fuwu.jd.com/" target="_blank" rel="nofollow">延保服务</a></div><div><a href="http://giftcard.jd.com/market/index.action" target="_blank" rel="nofollow">京东E卡</a></div><div><a href="http://help.jd.com/help/question-91.html" target="_blank" rel="nofollow">节能补贴</a></div><div><a href="http://mobile.jd.com/" target="_blank" rel="nofollow">京东通信</a></div></dd></dl><span class="clr"></span></div>
</div><!-- service end --><div class="w"><div id="footer-2013"><div class="links"><a rel="nofollow" target="_blank" href="http://www.jd.com/intro/about.aspx">关于我们</a>|<a rel="nofollow" target="_blank" href="http://www.jd.com/contact/">联系我们</a>|<a rel="nofollow" target="_blank" href="http://zhaopin.jd.com/">人才招聘</a>|<a rel="nofollow" target="_blank" href="http://www.jd.com/contact/joinin.aspx">商家入驻</a>|<a rel="nofollow" target="_blank" href="http://sale.jd.com/act/y3surX7qpM.html">广告服务</a>|<a rel="nofollow" target="_blank" href="http://app.jd.com/">手机京东</a>|<a target="_blank" href="http://club.jd.com/links.aspx">友情链接</a>|<a target="_blank" href="http://cps.jd.com/">销售联盟</a>|<a href="http://club.jd.com/" target="_blank">京东社区</a>|<a href="http://gongyi.jd.com/" target="_blank">京东公益</a></div><div class="copyright">北京市公安局朝阳分局备案编号110105014669  |  京ICP证070359号  |  互联网药品信息服务资格证编号(京)-非经营性-2011-0034<br><a rel="nofollow" href="http://misc.360buyimg.com/skin/df/i/com/f_music.jpg" target="_blank">音像制品经营许可证苏宿批005号</a>|  出版物经营许可证编号新出发(苏)批字第N-012号  |  互联网出版许可证编号新出网证(京)字150号<br><a href="http://misc.360buyimg.com/wz/wlwhjyxkz.jpg" target="_blank">网络文化经营许可证京网文[2011]0168-061号</a>Copyright © 2004-2015  京东JD.com 版权所有<br>京东旗下网站:<a href="http://en.jd.com/" target="_blank">English Site</a></div><div class="authentication"><a rel="nofollow" target="_blank" href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202007080200026"><img width="108" height="40" alt="经营性网站备案中心" src="<c:url value='/resource'/>/108_40_zZOKnl.gif" class="err-product"></a><a rel="nofollow" target="_blank" tabindex="-1"href="https://ss.cnnic.cn/verifyseal.dll?sn=2008070300100000031&ct=df&pa=294005"id="urlknet"><img width="108" height="40" border="true"name="CNNIC_seal" alt="可信网站"src="<c:url value='/resource'/>/kxwz.gif"class="err-product"></a><a rel="nofollow" target="_blank"href="http://www.bj.cyberpolice.cn/index.do"><img width="108"height="40" alt="朝阳网络警察"src="<c:url value='/resource'/>/cywljc.png"class="err-product"></a><a rel="nofollow" target="_blank"href="https://search.szfw.org/cert/l/CX20120111001803001836"><imgwidth="112" height="40"src="<c:url value='/resource'/>/112_40_WvArIl.png"class="err-product"></a></div></div>
</div>
</body>
</html>

(2)代码开发

实体pojo:

商品实体类:

package com.hnu.scw.model;
/*** 商品实体* @author scw**/
public class ProductModel {// 商品编号private String pid;// 商品名称private String name;// 商品分类名称private String catalog_name;// 价格private float price;// 商品描述private String description;// 图片名称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 getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getPicture() {return picture;}public void setPicture(String picture) {this.picture = picture;}
}

检索实体类:

package com.hnu.scw.model;
/*** 搜索商品的实体类* @author scw**/
public class ProductSearch {private String queryString;  //关键字private String catalog_name; //类别private String price;  //价格private String sort;  //排序类型public String getQueryString() {return queryString;}public void setQueryString(String queryString) {this.queryString = queryString;}public String getCatalog_name() {return catalog_name;}public void setCatalog_name(String catalog_name) {this.catalog_name = catalog_name;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getSort() {return sort;}public void setSort(String sort) {this.sort = sort;}
}

dao层:

package com.hnu.scw.dao;import java.util.List;import com.hnu.scw.model.ProductModel;
import com.hnu.scw.model.ProductSearch;public interface SearchProductDao {public List<ProductModel> searchProduct(ProductSearch productSearch) throws Exception;
}
package com.hnu.scw.dao.impl;
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.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
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.hnu.scw.dao.SearchProductDao;
import com.hnu.scw.model.ProductModel;
import com.hnu.scw.model.ProductSearch;
@Repository
public class SearchProductDaoImpl implements SearchProductDao {//通过springmvc来进行注入solr服务器@Autowiredprivate SolrServer solrServer;@Overridepublic List<ProductModel> searchProduct(ProductSearch productSearch) throws Exception {SolrQuery solrQuery = new SolrQuery();//设置关键字solrQuery.setQuery(productSearch.getQueryString());//设置默认检索域solrQuery.set("df", "product_keywords");//设置过滤条件if(null != productSearch.getCatalog_name() && !"".equals(productSearch.getCatalog_name())){solrQuery.set("fq", "product_catalog_name:" + productSearch.getCatalog_name());}if(null != productSearch.getPrice() && !"".equals(productSearch.getPrice())){//0-9   50-*  对价格进行过滤String[] p = productSearch.getPrice().split("-");solrQuery.set("fq", "product_price:[" + p[0] + " TO " + p[1] + "]");}// 价格排序if ("1".equals(productSearch.getSort())) {solrQuery.addSort("product_price", ORDER.desc);} else {solrQuery.addSort("product_price", ORDER.asc);}// 分页solrQuery.setStart(0);solrQuery.setRows(16);// 只查询指定域solrQuery.set("fl", "id,product_name,product_price,product_picture");// 高亮// 打开开关solrQuery.setHighlight(true);// 指定高亮域solrQuery.addHighlightField("product_name");// 前缀solrQuery.setHighlightSimplePre("<span style='color:red'>");solrQuery.setHighlightSimplePost("</span>");// 执行查询QueryResponse response = solrServer.query(solrQuery);// 文档结果集SolrDocumentList docs = response.getResults();Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();List<ProductModel> productModels = new ArrayList<ProductModel>();for (SolrDocument doc : docs) {ProductModel productModel = new ProductModel();productModel.setPid((String) doc.get("id"));productModel.setPrice((Float) doc.get("product_price"));productModel.setPicture((String) doc.get("product_picture"));Map<String, List<String>> map = highlighting.get((String) doc.get("id"));List<String> list = map.get("product_name");productModel.setName(list.get(0));productModels.add(productModel);}return productModels;}}

service层:

package com.hnu.scw.service;import java.util.List;
import com.hnu.scw.model.ProductModel;
import com.hnu.scw.model.ProductSearch;public interface SearchProductService {public List<ProductModel> searchProduct(ProductSearch productSearch) throws Exception;}
package com.hnu.scw.service.impl;import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hnu.scw.dao.impl.SearchProductDaoImpl;
import com.hnu.scw.model.ProductModel;
import com.hnu.scw.model.ProductSearch;
import com.hnu.scw.service.SearchProductService;@Service
public class SearchProductImpl implements SearchProductService{@Autowiredprivate SearchProductDaoImpl searchProductDaoImpl;@Overridepublic List<ProductModel> searchProduct(ProductSearch productSearch) throws Exception {return searchProductDaoImpl.searchProduct(productSearch);}}

controller层:

package com.hnu.scw.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
/*** 进行商品搜索处理(通过solr)* @author scw*2018-02-27*/
import org.springframework.web.bind.annotation.RequestMapping;
import com.hnu.scw.model.ProductModel;
import com.hnu.scw.model.ProductSearch;
import com.hnu.scw.service.impl.SearchProductImpl;
@Controller
public class SearchProductController {@Autowiredprivate SearchProductImpl searchProductImpl ;/*** 对于搜索的处理,包括关键字,价格,类别,还有排序方式* @param productSearch* @return* @throws Exception */@RequestMapping(value="/list")public String searchProduct(ProductSearch productSearch , Model model) throws Exception{//获取到检索的所有结果List<ProductModel> searchProducts = searchProductImpl.searchProduct(productSearch);//设置回显内容model.addAttribute("productModels", searchProducts);model.addAttribute("queryString", productSearch.getQueryString());model.addAttribute("catalog_name", productSearch.getCatalog_name());model.addAttribute("price", productSearch.getPrice());model.addAttribute("sort", productSearch.getSort());return "product_list";}}

(3)进行测试

注意事项:
第一点:商品的信息最初是存放在mysql数据库中,而要实现Solr的站内搜索,就需要把数据库中的商品数据导入到Solr服务器中,这个在上面的知识点已经提到过了,所以就不多介绍,可以翻到上面进行查阅。大体的数据如下:

第二点:因为,这是单机的Solr检索,而且Solr服务器也是在本地开启的,而现在又有一个Web项目,所以端口就需要进行修改下,我这里Solr服务器是用的8080端口,而Web项目是用的8081端口。。修改端口方式如下:

进行测试,访问项目链接,

由于我本身的数据中就只有部分,所以,我进行检索台灯,得到如下的结果:

如果有需要这个Demo的小伙伴,那么可以通过百度云链接来进行获取,如果写得不明白的地方,也欢迎各位进行交流。

https://pan.baidu.com/s/1dRClm2           密码:olio

好了,对于Solr的单机运行就到这里了,当然,比如像真正的京东和淘宝,都不是单机的Solr,肯定是集群的,这样的话,又存在着有不同的地方,另外,还有一种比较好的搜索架构也是挺不错的---Elasticsearch,它也是基于Lucene的系统架构,但是是一种分布式的检索,所以,与Solr各有优势,这个就需要看具体的需求来决定了。总而言之,技术没有总结,只有不断的努力学习和研究。。。。。
--------------------- 
作者:Cs_hnu_scw 
来源:CSDN 
原文:https://blog.csdn.net/cs_hnu_scw/article/details/79388080 
版权声明:本文为博主原创文章,转载请附上博文链接!

手把手教你如何玩转Solr(包含项目实战)[转载]相关推荐

  1. 手把手教你如何玩转Solr(包含项目实战)

    备注:学习Solr最好先了解一下Lucene的基本内容,不需要很熟,但是知道个基础即可. 大家可以关注我的微信公众号:Java菜鸟进阶之路 一:Solr简介 Solr是一个独立的企业级搜索应用服务器, ...

  2. 手把手教你如何玩转消息中间件(ActiveMQ)

    原 手把手教你如何玩转消息中间件(ActiveMQ) 2018年07月15日 18:07:39 Cs_hnu_scw 阅读数 6494 </div><div class=" ...

  3. clion浏览linux代码,手把手教你使用 Clion 开发 Linux C++ 项目

    手把手教你使用 Clion 开发 Linux C++ 项目 关于CLion CLion是一款专为开发C及C++所设计的跨平台IDE.它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员 ...

  4. 手把手教你使用 Clion 开发 Linux C++ 项目

    手把手教你使用 Clion 开发 Linux C++ 项目 关于CLion CLion是一款专为开发C及C++所设计的跨平台IDE.它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员 ...

  5. 华为表哥手把手教你利用Jenkins持续集成iOS项目,教不会我花式拉翔!!!

    手把手教你利用Jenkins持续集成iOS项目: 前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段.用户们都是很挑剔的.如果一个公司的推广团队好不容易砸了重金推广了一个APP ...

  6. 手把手教你完成一个数据科学小项目(9):情感分析与词云

    前言 请先阅读"中国年轻人正带领国家走向危机",这锅背是不背? 一文,以对"手把手教你完成一个数据科学小项目"系列有个全局性的了解. 本系列代码统一开源在Git ...

  7. 手把手教你上手Git并上传项目到GitHub官网

    手把手教你上手Git并上传项目到GitHub官网 Learning Git Branch: 学习 Git 最好的游戏及教程 https://learngitbranching.js.org 这个就是那 ...

  8. 手把手教你写web全栈入门项目—React+Koa+MongoDB(3w字教程,真的很详细,有代码)

    手把手教你写web全栈入门项目-React+Koa+MongoDB

  9. 手把手教你完成一个数据科学小项目(7):经纬度获取与BDP可视化

    前言 请先阅读"中国年轻人正带领国家走向危机",这锅背是不背? 一文,以对"手把手教你完成一个数据科学小项目"系列有个全局性的了解. 本系列代码统一开源在Git ...

最新文章

  1. Nature:大脑佛一点,活得久一点,这是哈佛医学院的最新研究
  2. <X86汇编语言:实模式到保护模式>四十六 中断和异常的处理与抢占式多任务
  3. matlab与音频处理
  4. Django 模板语言 标签
  5. python分支结构基础实训_零基础Python教程-分支结构
  6. javascript核心_只需几分钟即可学习这些核心JavaScript概念
  7. 微信H5支付(基于Java实现微信H5支付)
  8. 揭秘:快手用AI在短视频里玩出三大花样,背后是怎样的技术原理?
  9. 《编程之美:分层遍历二叉树》的另外两个实现
  10. WPF XamlObjectWriterException:无法创建未知类型Grid
  11. Android自定义控件之app标题栏的封装
  12. C语言基本入门英语单词,C语言基本入门英语单词.doc
  13. Super Jumping! Jumping! Jumping!超级跳!跳!跳!
  14. 乘积取中法matlab,遺傳算法(GA)的matlab實現
  15. 【渝粤题库】广东开放大学 物业管理实务 形成性考核
  16. NKOI 1905 慢跑小路
  17. 最新!有道文档翻译免费获取方法,有道翻译文档复制方法,解决有道文档翻译不能复制问题
  18. 云计算零基础(2)配置yum仓库
  19. fffffffffffffffffffffffffffffffff
  20. 【C++】两个队列实现一个栈

热门文章

  1. Tableau(1):绘制条形图、堆积图、直方图
  2. each中的this
  3. 示波器抓板子串口,波形错误,杂乱无章
  4. u大师制作linux启动盘制作工具,U大师U盘启动盘制作工具V4.3.2|U大师U盘启动盘制作工具正式版...
  5. 光纤的速度到底有多快
  6. Null value was assigned to a property of primitive type sett
  7. 高等数学需要记住的一些点
  8. Angular UI框架 Ng-alain @delon的脚手架的生成开发模板
  9. 点云质量评估:BD-BR和BD-PSNR计算
  10. Student学生表(学号,姓名、性别、年龄、组织部门),Course 课程表(编号,课程名称),Sc选课表(学号,课程编号,成绩)