https://blog.csdn.net/cs_hnu_scw/article/details/79388080

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

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

Solr

基于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
*/
@Test
public void addContent() throws Exception{
//设置solr服务器的路径,默认是使用第一个collection库,所以路径最后可以不加collection1
String 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
*/
@Test
public 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
*/
@Test
public 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
*/
@Test
public 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.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://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" οnkeydοwn="javascript:if(event.keyCode==13) {query()}">
<input type="button" value="搜索" class="button" οnclick="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> > <a
href="#">女装</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"><img
width="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服务器
@Autowired
private SolrServer solrServer;

@Override
public 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{
@Autowired
private SearchProductDaoImpl searchProductDaoImpl;

@Override
public 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 {

@Autowired
private 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各有优势,这个就需要看具体的需求来决定了。总而言之,技术没有总结,只有不断的努力学习和研究。。。。。
————————————————
版权声明:本文为CSDN博主「Cs_hnu_scw」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cs_hnu_scw/article/details/79388080

java 框架-企业级搜索 Solr的更多相关文章

  1. 使用 Solr 构建企业级搜索服务器

    最近因项目需要一个全文搜索引擎服务, 在考察了Lucene及Solr后,我们选择了Solr. 本文简要记录了基于Solr搭建一个企业搜索服务器的过程.网上的资料太多千篇一律,也可能版本不同,总之在参照 ...

  2. Lucene/Solr企业级搜索学习资源

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http GSol ...

  3. Java 框架、库和软件的精选列表(awesome java)

    原创翻译,原始链接 本文为awesome系列中的awesome java Awesome Java Java 框架.库和软件的精选列表 项目 Bean映射 简化 bean 映射的框架 dOOv - 为 ...

  4. 使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索

    使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索 2015-03-26 dotNET跨平台 最近几年出现的云计算为组织和用户带来了福音.组织对客户的了解达到前所未有的透彻, ...

  5. Java框架介绍-13个不容错过的框架项目

    本文转自互联网,个人收藏所用. 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需.不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术. ...

  6. 企业级搜索引擎Solr使用入门指南

    由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择: 基于Lucene自己进行封装实现站内搜索. 工作量及扩展性都 ...

  7. 2016年7款最流行的Java框架

    虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...

  8. Redis 分布式缓存 Java 框架

    为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上,每一毫秒都很重要.根据谷歌的一项研究,假如一个网站在3秒钟或更短时间内没有加载成功,会有 53% 的手机用户会离开. 缓存 ...

  9. 2016年7款最佳 Java 框架

    毫无疑问,Java 是目前最为流行的编程语言之一,这里我们挖掘出了一些比较受欢迎的框架的有效信息,它们可以减轻全球软件开发人员的日常工作. RebelLabs的一项调查显示,通过在线Java用户论坛( ...

随机推荐

  1. android studio: 实现类似于XCode中的#pragma mark的效果

    代码行数写多了,想找一个指定的方法真困难,关键有时候记不住方法的名字,用Ctrl+O也不好使,突然想到以前做iOS开发时,XCode里有一个#pragma mark的功能,很好用:在代码中定义这样一个 ...

  2. IDEA启动tomcat报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component

    先看错误日志: -May- ::.M26 -May- :: :: UTC -May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLog ...

  3. python基础之内置模块(二)

    configparser configparser用来对特定格式的文件进行解析处理,比如ha-proxy,rsync,samba配置文件等等均可.来个简单的文件先看下: [section1] #节点 ...

  4. LeetCode_121. Best Time to Buy and Sell Stock

    121. Best Time to Buy and Sell Stock Easy Say you have an array for which the ith element is the pri ...

  5. (四)java对象的结构和对象的访问定位

    在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 一. 对象头 HotSpot虚拟机的对象 ...

  6. 小程序 实现fadeIn 渐变的效果

    const winHeight = wx.getSystemInfoSync().windowHeight Page({ data: { logs: [] }, onLoad: function () ...

  7. Vue + GraphQL初试

    基本用法 GraphQL概述 GraphQL基本语法特性 GraphQL类型系统 GraphQL类型系统内置基础类型 GraphQL类型系统内置修饰符 GraphQL工作原理 GraphQL执行过程 ...

  8. Linux系统终端常用配置文件更改

    目录列表: 1.alias别名永久保存 2.解决vim文件没有颜色的问题 3.vim插件supertap插件安装(可支持自动补全,非函数代码补全,仅支持在当前编辑文档内补全) 4.vim插件管理 5. ...

  9. vim学习一

    来源 实验楼(shiyanlou.com)的<Vim编辑器>课程的学习报告. 6种基本模式 普通模式 默认进入vi时的模式,使用编辑器命令,i h j k l 等等 插入模式 用户按下 i ...

  10. 最新 中手游java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.中手游等10家互联网公司的校招Offer,因为某些自身原因最终选择了中手游.6.7月主要是做系统复习.项目复盘.LeetCo ...