solr实现商品的搜索功能和安装

Solr简介

用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果;

折叠编辑本段Solr引擎

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

折叠编辑本段Solr特点

文档通过Http利用XML 加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

搜索实现的原理

网络爬虫(网络蜘蛛)去各个网站上抓取网页,然后保存到服务器上,通过分词器,分析网页中的出现最多的关键词,按照词出现的次数进行排名。当我们搜索,实际上就是关键词出现的次数最多对应的网页的排名。

solr的工作机制:

1、solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能

2、业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

为什么要用solr服务,为什么要用luncence?

问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢?

答案就是全文检索工具的实现,luncence采用了词元匹配和切分词。举个例子:北京天安门------luncence切分词:北京  京天  天安  安门  等等这些分词。所以我们搜索的时候都可以检索到。

有一种分词器就是IKAnalyzer中文分词器,它有细粒度切分和智能切分,即根据某种智能算法。

这就使用solr的最大的好处:检索功能的实现。

使用步骤;

(1)solr服务器搭建,因为solr是用java5开发的,所以需要jdk和tomcat。搭建部署

(2)搭建完成后,我们需要将要展示的字段引入solr的库中。配置spring与solr结合,工程启动的时候启动solr

(3)将数据库中的查询内容导入到solr索引库,这里使用的是solrj的客户端实现的。具体使用可以参考api

(4)建立搜索服务,供客户端调用。调用solr,查询内容,这中间有分页功能的实现。solr高亮显示的实现。

(5)客户端接收页面的请求参数,调用搜索服务,进行搜索。

业务字段判断标准:

1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述

(这些相当于将标签给了solr,导入商品数据后,solr对这些字段的对应的商品的具体内容进行分词切分,然后,我们就可以搜索到相关内容了)

2、后续的业务是否需要用到此字段。例如:商品id。

需要用到的字段:

1、商品id

2、商品title

3、卖点

4、价格

5、商品图片

6、商品分类名称

7、商品描述

Solr中的业务字段:

1、id——》商品id

其他的对应字段创建solr的字段。

<field name="item_title" type="text_ik" indexed="true" stored="true"/>

<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>

<field name="item_price"  type="long" indexed="true" stored="true"/>

<field name="item_image" type="string" indexed="false" stored="true" />

<field name="item_category_name" type="string" indexed="true" stored="true" />

<field name="item_desc" type="text_ik" indexed="true" stored="false" />

 

<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>

<copyField source="item_title" dest="item_keywords"/>

<copyField source="item_sell_point" dest="item_keywords"/>

<copyField source="item_category_name" dest="item_keywords"/>

<copyField source="item_desc" dest="item_keywords"/>

重新启动tomcat

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。有效降低频繁访问数据库对数据库造成的压力。

第一步:将solr部署在linux系统下。

第二步:solrJ是solr的客户端,使用它需要依赖solrJ的jar包。

第三步:将数据库的内容添加到solr的索引库,这样查询就在索引库查询,而不是数据库了。

controller层:

1

2

3

4

5

6

7

8

9

10

11

12

@Controller

@RequestMapping("/manager")

public class ItemController {

 @Autowired

 private ItemService itemService;

 @RequestMapping("/importall")

 @ResponseBody

  public   TaotaoResult importAllItem(){

            TaotaoResult result= itemService.importAllItem();

            return result;

 }

}<br>service层编写:<br>多表查询商品,显示在页面的逻辑编写:<br>mapper.java

1

2

3

4

5

6

7

8

9

10

11

package com.taotao.search.mapper;

 

import java.util.List;

 

import com.taotao.search.pojo.Item;

 

public interface ItemMapper {

    List<item> getItemList();

 

}

</item>

  mapper.xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.taotao.search.mapper.ItemMapper">

<select id="getItemList" resultType="com.taotao.search.pojo.Item">

    SELECT

    a.id,

    a.title,

    a.sell_point,

    a.price,

    a.image,

    b. NAME category_name

    FROM

    tb_item a

    LEFT JOIN tb_item_cat b ON a.cid = b.id

</select>

</mapper>

第四步:从索引库查询的逻辑编写:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

//从索引库里面获取商品信息,现在这个dao层是从索引库获取信息,因为之前的写的逻辑是将db里面的数据导入到索引库。后面的查询都是从索引库中进行,而不从数据库了

@Repository

public class SearchDaoImpl implements SearchDao {

    @Autowired

    private SolrServer solrServer;

 

    @Override

    public SearchResult search(SolrQuery query) throws Exception {

        //这是从索引库里面,直接执行查询

        QueryResponse response = solrServer.query(query);

        //获取查询的结果

        SolrDocumentList documentList= response.getResults();

         

        SearchResult result=new SearchResult();

        //这是获取总记录数

        result.setRecordCount(documentList.getNumFound());

         

        List<Item> itemList=new ArrayList<>();

        //商品的高亮显示,即当鼠标移到字上时,该字体变色,这是从QueryResponse中获取的

        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

         

        for (SolrDocument solrDocument : documentList) {

             

            //每个SolrDocument都是一个商品pojo的内容,所以这里要创建一个商品的pojo对象,来获取详细的字段

            Item item=new Item();

            item.setId((String) solrDocument.get("id"));

            //高亮显示是title的高亮显示

            List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");

            String title="";

            if (list!=null && list.size()>0) {

                title=list.get(0); 

            }

            else{

                title=(String) solrDocument.get("item_title"); 

            }

         

            item.setTitle(title);

            item.setPrice((Long) solrDocument.get("item_price"));

            item.setImage((String) solrDocument.get("item_image"));

            item.setCategory_name((String) solrDocument.get(" item_category_name"));

            item.setSell_point((String) solrDocument.get("item_sell_point"));

           itemList.add(item);

        }

         

          result.setItemList(itemList);

     

        return result;

    }

 

}

第五步:索引库内容建立好后,开始编写对外的服务接口,即通过条件搜索具体的商品,比如手机,会显示出总共的手机列表信息,第几页,总共多少页,总共多少个搜索结果

******************************************************************************************************************************************************

Solr和lucene区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。

Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。

Solr的下载

clip_image002

http://lucene.apache.org/

最新版:5.3.1

本课程的版本:4.10.3

clip_image004

Solr的安装及配置

clip_image006

安装solr,就是去部署它的war包,war包所在的位置如图:

clip_image008

开发环境

Jdk:1.7以上。1.7.0_72

Tomcat:7以上。apache-tomcat-7.0.53

Solr:4.10.3

Solr集成tomcat

第一步:安装tomcat,建议安装一个全新的tomcat。

第二步:上传solr安装压缩包到服务器上,然后解压

unzip -q /root/solr-4.10.3.zip

第三步:在tomcat的webapps中事先建立一个solr工程文件夹

mkdir /usr/local/apache-tomcat-7.0.63/webapps/solr

然后将solr的war包解压到solr工程文件夹里面去

unzip /root/solr-4.10.3/dist/solr-4.10.3.war -d /usr/local/apache-tomcat-7.0.63/webapps/solr

然后,将日志工具jar包添加到solr的war工程的WebInf的lib中

cp /root/solr-4.10.3/example/lib/ext/*.jar /usr/local/apache-tomcat-7.0.63/webapps/solr/WEB-INF/lib/

第四步:从solr的安装目录中拷贝一个示例solrhome到我们的服务器真实部署目录中

拷贝: cp -r /root/solr-4.10.3/example/solr /usr/local/

改名: mv /usr/local/solr/ /usr/local/solrhome

第五步:告诉solr的war工程,我们准备的solrhome目录所在的路径

vi /usr/local/apache-tomcat-7.0.63/webapps/solr/WEB-INF/web.xml

clip_image010

至此,可以启动tomcat,进行测试

了解solrhome

1、collection1:是一个solrcore,一个solrcore就是一个索引库。一个solr服务器上可以有多solrcore。每个索引库之间是相互独立的。

2、\solrhome\collection1\conf:是存放每个solrcore的个性配置。

clip_image012

3、Solrconfig.xml

a) luceneMatchVersion:匹配lucene的版本信息

b) Lib:solrcore扩展使用的jar包。默认值是collection1\lib,如果没有此文件夹就创建一个。

c) dataDir:索引库存放的目录。默认是collection1\data文件夹。如果没有solr会自动创建。如果想修改为其他位置,需要配置此节点。

d) requestHandler:配置solr对外提供服务的url

i. <requestHandler name="/select" class="solr.SearchHandler">:查询索引库使用的url

ii. <requestHandler name="/update" class="solr.UpdateRequestHandler">

维护索引库使用的url

e) defaultQuery:管理页面默认的查询条件 *:*

4、Core.properties:配置了solrcore的名字。

第六步:告诉solr工程solrhome的位置。修改solr/WEB-INF/web.xml文件。

clip_image014

第七步:启动tomcat

访问http://localhost:8080/solr

clip_image016

管理界面功能介绍

Core Admin

solrcore的管理 功能。

添加一个solrcore

添加步骤:

第一步:把collection1复制一份改名为collection2

第二步:修改core.properties。name=collection2

第三步:重启tomcat

clip_image018

Core Selecter

选择要管理哪个solrcore。

clip_image020

Analysis

clip_image022

查看域的分词效果。

Dataimport

可以实现把数据库中的数据导入到索引库中。

clip_image024

Documents

索引库维护功能。

增删改查

clip_image026

Query

索引查询功能。

clip_image028

索引的维护

在solr中域必须先定义后使用。而且每个document中必须有一个id域。

Schema.xml

Field:域的定义。

Name:域的名称

Type:域的类型

Indexed:是否索引

Stored:是否存储

multiValued:是否多值,如果是多值在一个域中可以保持多个值。

dynamicField动态域

Name:域的名称,是一个表达式。如果域的名称和表达式相匹配,此域名就可以使用。

Type:域的类型

Indexed:是否索引

Stored:是否存储

multiValued:是否多值,如果是多值在一个域中可以保持多个值。

uniqueKey

每个文档必须有一个uniqueKey,而且不能重复。相当于表中的主键。

copyField

复制域。

Source:源域

Dest:目标域。

创建文档时,solr会自动把源域的内容复制到目标域。使用复制域可以提供查询的性能。

fieldType

域的类型。

Name:域类型名。

Class:对应的实现类。solr.TextField类似于Lucene中的TextField。可以配置用户自定义的分析器。

自定义fieldType使用中文分析器

配置中文分析器

配置步骤:

第一步:把IKAnalyzer2012FF_u1.jar添加到solr工程的lib库中。

第二步:把配置文件和扩展词典、停用词词典添加到solr工程classpath下。Solr/WEB-INF/classes。保证字典的字符集是utf-8.

配置自定义fieldtype

在schema.xml中添加如下内容:

<!-- IKAnalyzer-->

<fieldType name="text_ik" class="solr.TextField">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

<!--IKAnalyzer Field-->

配置自定义的域

<field name="title_ik" type="text_ik" indexed="true" stored="true" />

<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

重启tomcat,查看效果

clip_image030

淘淘商城商品信息搜索域定义

<!--product-->

<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"/>

添加文档

clip_image032

注意:每个文档必须有一个id域。而且域名必须在schema.xml中定义。

Dataimport插件

可以批量把数据库中的数据导入到索引库中。

需要的jar包

clip_image034

安装步骤:

第一步:把dataimport插件依赖的jar包添加到collection1\lib文件夹下。

第二步:把mysql的数据库驱动也放到collection1\lib文件夹下

第三步:修改solrhome/collection1/conf/solrconfig.xml,添加一个requestHandler。

<requestHandler name="/dataimport"

class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

<str name="config">data-config.xml</str>

</lst>

</requestHandler>

第四步:创建一个data-config.xml。目录和solrconfig.xml在同一个目录下collection1\conf。

<?xml version="1.0" encoding="UTF-8" ?>

<dataConfig>

<dataSource type="JdbcDataSource"

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://192.168.33.10:3306/taotao"

user="root"

password="root"/>

<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>

第五步:重启tomcat后,进入solr管理页面,执行数据导入

clip_image036

索引库的查询

查询语法支持的参数

q:主查询条件。完全支持lucene语法。还进行了扩展。

fq:过滤查询。是在主查询条件查询结果的基础上进行过滤。

sort:排序条件。排序的域asc。如果有多个排序条件使用半角逗号分隔。

start, rows:分页处理。Start起始记录rows每页显示的记录条数。

fl:返回结果中域的列表。使用半角逗号分隔。

df:默认搜索域

wt:响应结果的数据格式,可以是json、xml等。

hl:开启高亮显示。

hl.fl:要高亮显示的域。

hl.simple.pre:高亮显示的前缀

hl.simple.post:高亮显示的后缀

SolrJ客户端

可以实现对索引库的增删改查操作。

使用步骤:

第一步:创建一java工程。

第二步:导入jar包。导入solrj的jar 包。

clip_image038

clip_image040

索引库的维护

添加文档

第1步:创建SolrServer对象和服务端建立连接。HttpSolrServer子类来完成。集群环境使用CloudSolrServer。

第2步:创建一文档对象。SolrInputDocument。

第3步:向文档对象中添加域。使用addField添加域。要求必须有id域,而且每个域必须在schema.xml中定义。

第4步:使用solrServer对象把文档提交到服务器。

代码实现

clip_image042

//添加文档对象

@Test

public void addDocument() throws Exception {

//创建一个SolrServer对象

//参数:solr服务器的url

SolrServer server = new HttpSolrServer("http://localhost:8080/solr");

//创建文档对象

SolrInputDocument document = new SolrInputDocument();

//添加域

document.addField("id", "num001");

document.addField("title_ik", "巧手DIY彩帘");

//把document对象写入索引库

server.add(document);

//提交修改

server.commit();

}

删除文档

根据id删除文档

//根据id删除文档

@Test

public void deleteDocumentById() throws Exception {

SolrServer server = new HttpSolrServer("http://localhost:8080/solr");

//删除文档

server.deleteById("num001");

//提交修改

server.commit();

}

根据查询删除文档

//根据查询删除文档

@Test

public void deleteDocumentByQuery() throws Exception {

SolrServer server = new HttpSolrServer("http://localhost:8080/solr");

//根据查询条件删除

server.deleteByQuery("*:*");

//提交修改

server.commit();

}

修改文档

Solrj并没有一个方法可以修改文档。还是使用add方法。只需要添加一个新的文档,保证新文档的id和被修改文档的id一致即可。

本质先删除后添加。

查询索引库

实现步骤

第一步:创建一个solrServer对象。

第二步:创建一个solrQuery对象。

第三步:向solrQuery对象中添加查询条件。

第四步:执行查询。返回文档列表。

第五步:遍历列表。

代码实现

//简单查询

@Test

public void queryIndex() throws Exception {

SolrServer server = new HttpSolrServer("http://localhost:8080/solr");

//创建一个查询对象

SolrQuery query = new SolrQuery();

//添加查询条件

//query.setQuery("*:*");

query.set("q", "*:*");

//执行查询

QueryResponse response = server.query(query);

//取文档列表

SolrDocumentList solrDocumentList = response.getResults();

System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());

//遍历列表

for (SolrDocument solrDocument : solrDocumentList) {

System.out.println(solrDocument.get("id"));

System.out.println(solrDocument.get("product_name"));

System.out.println(solrDocument.get("product_price"));

System.out.println(solrDocument.get("product_catalog_name"));

System.out.println(solrDocument.get("product_picture"));

}

}

综合案例

需求

使用Solr实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格范围搜索商品信息,也可以根据价格进行排序。

需求分析

开发需要的文档

1、数据库的表结构。

2、页面原型图。

3、业务流程图

页面原型分析

clip_image044

流程图

clip_image045

Dao层

功能:查询solr服务返回一个商品列表。需要一个query对象,执行query对象进行查询,返回商品列表。

参数:SolrQuery query

返回值:ResultModel 包含商品列表

商品的pojo:

public class ProductModel {

// 商品编号

private String pid;

// 商品名称

private String name;

// 商品分类名称

private String catalog_name;

// 价格

private float price;

// 商品描述

private String description;

// 图片名称

private String picture;

}

返回值Pojo:

public class ResultModel {

// 商品列表

private List<ProductModel> productList;

// 商品总数

private Long recordCount;

// 总页数

private int pageCount;

// 当前页

private int curPage;

}

方法定义:

ResultModel queryProduct(SolrQuery query) throws Exception;

Service

功能:接收controller传递过来的参数。创建一SolrQuery对象,拼装查询条件调用Dao层执行查询返回一个ResultModel对象。还需要计算商品列表的总页数。

参数:

1、查询条件:String queryString

2、商品分类名称:String catalog_name

3、价格区间过滤条件:使用一个字符串来描述一个区间例如:

*-10,10-20,20-30,30-*。

String price

4、排序条件:只需要接收一个排序的方式就可以了。0:升序1:降序。 String sort

5、分页条件:接收一个页码是一个Integer数据。需要我们确定每页显示商品的数量。可以定义在常量或者配置文件。每页显示60商品。Integer page

返回值:ResultModel

方法定义:

ResultModel queryProduct(String queryString, String catalog_name, String price,String sort, Integer page);

Controller

功能:接收页面传递过来的参数,调用service查询商品列表。把查询结果传递给页面。还需要参数回显。

参数:

1. 查询条件:String queryString

2. 商品分类名称:String catalog_name

3. 价格区间过滤条件:使用一个字符串来描述一个区间例如:

*-10,10-20,20-30,30-*。

String price

4. 排序条件:只需要接收一个排序的方式就可以了。0:升序1:降序。 String sort

5. 分页条件:接收一个页码是一个Integer数据。需要我们确定每页显示商品的数量。可以定义在常量或者配置文件。每页显示60商品。Integer page

6、Model,传递参数使用。

返回值:String(逻辑视图名)

方法定义:

Public String queryProduct(String queryString, String catalog_name, String price,String sort, Integer page, Model model)

Jsp

clip_image047

代码实现

实现步骤

第一步:创建一web工程

第二步:导入jar包。需要springmvc、spring、solrj、solrj依赖的jar、日志相关的jar包。

第三步:编写dao

第四步:编写Service

第五步:编写Controller

第六步:配置前端控制器,创建springmvc.xml配置三大件。

代码实现

Dao

@Repository

public class ProductDaoImpl implements ProductDao {

@Autowired

private SolrServer solrServer;

@Override

public ResultModel queryProduct(SolrQuery query) throws Exception {

//根据query对象查询索引库

QueryResponse response = solrServer.query(query);

//取商品列表

SolrDocumentList documentList = response.getResults();

List<ProductModel> productList = new ArrayList<>();

for (SolrDocument solrDocument : documentList) {

//取商品信息

ProductModel productModel = new ProductModel();

productModel.setPid((String) solrDocument.get("id"));

//取高亮显示

String productName = "";

Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");

if (list != null && list.size() > 0) {

productName = list.get(0);

else {

productName = (String) solrDocument.get("product_name");

}

productModel.setName(productName);

productModel.setCatalog_name((String) solrDocument.get("product_catalog_name"));

productModel.setPrice((float) solrDocument.get("product_price"));

productModel.setPicture((String) solrDocument.get("product_picture"));

//添加到商品列表

productList.add(productModel);

}

//返回值对象

ResultModel resultModel = new ResultModel();

resultModel.setProductList(productList);

//查询结果总数量

resultModel.setRecordCount(documentList.getNumFound());

return resultModel;

}

}

Service

@Service

public class ProductServiceImpl implements ProductService {

@Autowired

private ProductDao productDao;

@Override

public ResultModel queryProduct(String queryString, String catalog_name,

String price, String sort, Integer page) throws Exception {

//拼装查询条件

SolrQuery solrQuery = new SolrQuery();

//查询条件

if (null != queryString && !"".equals(queryString)) {

solrQuery.setQuery(queryString);

else {

solrQuery.setQuery("*:*");

}

//分类名称过滤条件

if (null != catalog_name && !"".equals(catalog_name)) {

solrQuery.addFilterQuery("product_catalog_name:" + catalog_name);

}

//价格区间过滤条件

if (null != price && !"".equals(price)) {

String[] strings = price.split("-");

solrQuery.addFilterQuery("product_price:["+strings[0]+" TO "+strings[1]+"]");

}

//排序条件

if ("1".equals(sort)) {

solrQuery.setSort("product_price", ORDER.desc);

else {

solrQuery.setSort("product_price", ORDER.asc);

}

//分页条件

if (page == null) page = 1;

int start = (page - 1) * Global.PAGE_SIZE;

solrQuery.setStart(start);

solrQuery.setRows(Global.PAGE_SIZE);

//设置默认搜索域

solrQuery.set("df", "product_keywords");

//高亮显示

solrQuery.setHighlight(true);

//高亮显示的域

solrQuery.addHighlightField("product_name");

//前缀

solrQuery.setHighlightSimplePre("<span style=\"color:red\">");

//后缀

solrQuery.setHighlightSimplePost("</span>");

//执行查询

ResultModel resultModel = productDao.queryProduct(solrQuery);

//计算总页数

Long recordCount = resultModel.getRecordCount();

int pageCount = (int) (recordCount / Global.PAGE_SIZE);

if (recordCount % Global.PAGE_SIZE > 0) {

pageCount ++;

}

resultModel.setPageCount(pageCount);

resultModel.setCurPage(page);

return resultModel;

}

}

Controller

@Controller

public class ProductController {

@Autowired

private ProductService productService;

@RequestMapping("/list")

public String queryProduct(String queryString, String catalog_name,

String price, String sort, Integer page, Model model) {

// 查询商品列表

ResultModel resultModel = null;

try {

resultModel = productService.queryProduct(queryString,

catalog_name, price, sort, page);

catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 传递给页面

model.addAttribute("result", resultModel);

// 参数回显

model.addAttribute("queryString", queryString);

model.addAttribute("catalog_name", catalog_name);

model.addAttribute("price", price);

model.addAttribute("sort", sort);

model.addAttribute("page", page);

// 返回jsp

return "product_list";

}

}

Springmvc

<?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-3.1.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.1.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">

<!-- 配置扫描包 -->

<context:component-scan base-package="cn..jd" />

<!-- 配置注解驱动 -->

<mvc:annotation-driven />

<!-- jsp视图解析器 -->

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!-- 前缀 -->

<property name="prefix" value="/WEB-INF/jsp/"></property>

<!-- 后缀 -->

<property name="suffix" value=".jsp"></property>

</bean>

<bean class="org.apache.solr.client.solrj.impl.HttpSolrServer">

<constructor-arg value="http://localhost:8080/solr/"></constructor-arg>

</bean>

</beans>

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"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

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>SolrJD0508</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>

<!-- 配置前端控制器 -->

<!-- SpringMVC配置 -->

<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>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

<filter>

<filter-name>Character 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>Character Encoding</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值