wb.ouyang

毕竟几人真得鹿,不知终日梦为鱼

导航

solr

录:

1、solr介绍
2、solr安装配置
3、solr界面介绍
4、多solrcore的配置
5、Solr的基本使用
6、中文分词器
7、配置案例中products表字段对应的field域
8、Dataimport
9、Solrj的使用
10、案例:使用Solr实现电商网站中商品信息搜索功能

1、solr介绍    <--返回目录

  Solr是apache的顶级开源项目,它是使用java开发,基于lucene的全文检索服务器。
  Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。
    
   Solr是如何实现全文检索的呢?
    ** 索引流程:solr客户端(浏览器、java程序)可以向solr服务端发送POST请求,请求内容是包含Field等信息的一个xml文档,通过该文档,solr实现对索引的维护(增删改)
    ** 搜索流程:solr客户端(浏览器、java程序)可以向solr服务端发送GET请求,solr服务器返回一个xml文档。

  Solr同样没有视图渲染的功能。

  Solr和lucene的区别
    Lucene是一个全文检索引擎工具包,它只是一个jar包,不能独立运行,对外提供服务。
    Solr是一个全文检索服务器,它可以单独运行在servlet容器,可以单独对外提供搜索和索引功能。
    所以,Solr比lucene在开发全文检索功能时,更快捷、更方便。

 

2、solr安装配置    <--返回目录

  下载solr
        - Solr和lucene的版本是同步更新
        - 下载地址:http://archive.apache.org/dist/lucene/solr/
        - 下载版本:4.10.3
        - Linux下需要下载solr-4.10.3.tgz,windows下需要下载solr-4.10.3.zip。

  运行环境
        - Jdk:1.7及以上
        - Solr:4.10.3
        - Mysql:5X
        - Web服务器:tomcat 7

  Solr的安装部署
        第一步:安装tomcat
        第二步:将以下的war包,拷贝到tomcat的webapps目录下
        第三步:解压缩war包(启动Tomcat就会自动解压缩war包)
                解压缩之后,将war包删掉
        第四步:添加solr的扩展服务包
            - 将solr-4.10.3-->example-->lib-->ext目录下的jar包添加到apache-tomcat-7.0.53-solr-->webapps-->solr-->WEB-INF-->lib目录下
        第五步:添加log4j.properties
            - 将solr-4.10.3-->example-->resources目录下的log4j.properties复制到WEB-INF-->classes目录下
        第六步:在web.xml中指定solrhome的目录

<env-entry>
    <env-entry-name>solr/home</env-entry-name>
    <env-entry-value>E:\solr\solrhome</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

           
  第七步:Solrhome和solrcore的安装
        - Solrhome是solr服务运行的主目录,一个solrhome目录里面包含多个solrcore目录,一个solrcore目录里面包含一个solr实例运行时所需要的配置文件和数据文件。
        - 每一个solrcore都可以单独对外提供搜索和索引服务。
        - 多个solrcore之间没有关系。

        - Solrhome的目录结构
            ** 将solr-4.10.3\example\solr目录下的全部文件复制到<env-entry-value>E:\solr\solrhome</env-entry-value>指定的目录下。
            ** 这样solrhome和solrcore就安装成功了。

 

  第八步:Solrcore配置
        - 在solrcore的conf目录下,有一个solrconfig.xml的配置文件,用来配置solrcor的运行信息
        - 在该文件中,主要配置三个标签:lib标签、datadir标签、requestHandler标签
        - 如果对该文件不进行配置也可以,即使用默认的配置项。

  * lib标签
          - Solrcore需要添加一个扩展依赖包,通过lib标签来指定依赖包的地址
          - solr.install.dir:表示solrcore的安装目录
          - 将solr-4.10.3目录下contrib和dist两个文件夹复制到E:\solr\下,与solrhome同级
          - 修改lib标签

<lib dir="${solr.install.dir:../..}/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../..}/dist/" regex="solr-cell-\d.*\.jar" />

<lib dir="${solr.install.dir:../..}/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../..}/dist/" regex="solr-clustering-\d.*\.jar" />

<lib dir="${solr.install.dir:../..}/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../..}/dist/" regex="solr-langid-\d.*\.jar" />

<lib dir="${solr.install.dir:../..}/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../..}/dist/" regex="solr-velocity-\d.*\.jar" />

    * datadir标签
        <dataDir>${solr.data.dir:}</dataDir>
        每个SolrCore都有自己的索引文件目录,默认在SolrCore目录下的data中。
        data数据目录下包括了index索引目录和tlog日志文件目录。

    * requestHandler标签
        - requestHandler请求处理器,定义了索引和搜索的访问方式
        - 通过/update维护索引,可以完成索引的添加、修改、删除操作
            <requestHandler name="/update" class="solr.UpdateRequestHandler"></requestHandler>
        - 通过/select搜索索引
            ** <requestHandler name="/select" class="solr.SearchHandler"></requestHandler>
            ** 设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:
                <requestHandler name="/select" class="solr.SearchHandler">
                <!-- 设置默认的参数值,可以在请求地址中修改这些参数-->
                <lst name="defaults">
                <str name="echoParams">explicit</str>
                <int name="rows">10</int><!--显示数量-->
                <str name="wt">json</str><!--显示格式-->
                <str name="df">text</str><!--默认搜索字段-->
                </lst>
                </requestHandler>

3、solr界面介绍    <--返回目录

  启动solr服务:http://localhost:8080/solr

  Dashboard:仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。
  Logging:Solr运行日志信息
  Cloud:Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单,该部分功能在第二个项目,即电商项目会讲解。
  Core Admin:Solr Core的管理界面。在这里可以添加SolrCore实例。
   java properties:Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。
  Tread Dump:显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
  Core selector

 

   Analysis:通过此界面可以测试索引分析器和搜索分析器的执行情况。注:solr中,分析器是绑定在域的类型中的。

 

  dataimport:可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。默认没有配置,需要手工配置。

  Document:通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:

 

  Query:通过/select执行搜索索引,必须指定“q”查询条件方可搜索。

 

4、多solrcore的配置    <--返回目录

  配置多solrcore的好处:
  1、在进行solrcloud的时候,必须配置多solrcore
  2、每个solrcore之间是独立的,都可以单独对外提供服务。不同的业务模块可以使用不同的solrcore来提供搜索和索引服务。

  配置步骤:
  第一步:复制solrhome下的collection1目录到本目录下,修改名称为collection2
  第二步:修改solrcore目录下的core.properties,name=collection2。这样多solrcore就配置完成了。重启包含solr服务的servlet容器。

 

5、Solr的基本使用    <--返回目录

    * schema.xml文件
        - 在schema.xml文件中,主要配置了solrcore的一些数据信息,包括Field和FieldType的定义等信息,在solr中,
        Field和FieldType都需要先定义后使用。

    * 定义Field域
        - <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />    
        - Name:指定域的名称
        - Type:指定域的类型
        - Indexed:是否索引
        - Stored:是否存储
        - Required:是否必须
        - multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field像存储多个值的话,必须将multiValued设置为true。

    * 动态域dynamicField
        - <dynamicField name="*_i"  type="int" indexed="true"  stored="true"/>  对以_i结尾的field进行定义
        - Name:指定动态域的命名规则

    * 指定唯一键uniqueKey
        - <uniqueKey>id</uniqueKey>
        - 其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。
        - 一个schema.xml文件中必须有且仅有一个唯一键

    * 复制域copyField
        - <copyField source="cat" dest="text"/>
        - Source:要复制的源域的域名
        - Dest:目标域的域名
        - 由dest指的的目标域,必须设置multiValued为true。


    * 定义域的类型FieldType
        <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory"/>
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
                <!-- in this example, we will only use synonyms at query time
                <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
                    -->
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
            
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory"/>
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
                <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
        </fieldType>

        - Name:指定域类型的名称
            Class:指定该域类型对应的solr的类型
            Analyzer:指定分析器
            Type:index、query,分别指定搜索和索引时的分析器
            Tokenizer:指定分词器
            Filter:指定过滤器

 

6、中文分词器    <--返回目录

    * 使用ikanalyzer进行中文分词
        第一步:将ikanalyzer的jar包拷贝到以下目录apache-tomcat-7.0.53-solr-->webapps-->solr-->WEB-INF-->lib
        第二步:将ikanalyzer的扩展词库的配置文件拷贝到目录WEB-INF-->classes
            - ext_stopword.dic
            - IKAnalyzer.cfg.xml
            - mydict.dic
        第三步:配置FieldType
            <fieldType name="text_ik" class="solr.TextField">
                <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"></analyzer>   是否分词,指定分词器
            </fieldType>
        第四步:配置使用中文分词的Field
            <field name="content_ik" type="text_ik" indexed="true" stored="true"/> 是否索引,是否存储
        第五步:重启tomcat

 

7、配置案例中products表字段对应的field域    <--返回目录

    * 需求
        - 对案例中的products表的数据进行索引,所以需要先定义对应的Field域。
    * 分析
        - 需要往索引库添加的字段有:
        - pid、name、catalog、catalog_name、price、description、picture
    
    * 配置结果:

<!-- 商品名称Name -->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>

<!-- 商品分类ID  Catalog-->
<field name="product_catalog" type="string" indexed="true" stored="true"/>
<!-- 商品分类名称  catalog_name -->
<field name="product_catalog_name" type="string" indexed="true" stored="false"/>

<!-- 商品价格 Price -->
<field name="product_price" type="float" indexed="true" stored="true"/>

<!-- 商品描述 Description -->
<field name="product_description" type="text_ik" indexed="true" stored="false"/>

<!-- 商品图片地址 Picture -->
<field name="product_picture" type="string" indexed="false" stored="true"/>

 

8、Dataimport    <--返回目录

    * 该插件可以将数据库中指定的sql语句的结果导入到solr索引库中。first
    * 第一步:添加jar包
        - 将solr-4.10.3/dist目录下solr-dataimporthandler-4.10.3.jar包添加到solrhome目录contrib/dataimporthandler/lib中,该目录要收到创建
        - 修改solrconfig.xml文件,添加lib标签
            <lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />
            
        - 将mysql的驱动包,复制到以下目录  contrib/db/lib
        - 修改solrconfig.xml文件,添加lib标签
            <lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar" />
            
    * 第二步:配置requestHandler
        在solrconfig.xml中,添加一个dataimport的requestHandler

<-- 配置dataimport的requestHandler -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"
    <1st name="defaults">
        <str name="config">data-config.xml</str>
    </1st>
</requestHandler>


    * 第三步:创建data-config.xml
        在solrconfig.xml同级目录下,创建data-config.xml    

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
    <dataSource type="JdbcDataSource"   
              driver="com.mysql.jdbc.Driver"   
              url="jdbc:mysql://localhost:3306/solr"   
              user="root"   
              password="root"/>
    <document>
        <entity name="product" query="SELECT pid,name,catalog,catalog_name,price,description,picture FROM products ">
            <field column="pid" name="id"/>
            <field column="name" name="product_name"/>
            <field column="catalog" name="product_catalog"/>
            <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界面,/dataimport
        - 点击Execute按钮,开始执行
        - Refresh Status需要刷新才能查看执行的状态


9、Solrj的使用    <--返回目录

* 什么是solrj:Solrj就是solr服务器的java客户端。

    * 搭建工程
        - Solrj的依赖包和核心包 8+1个:solr-4.10.3/dist目录下solr-solrj-4.10.3.jar和solrj-lib下所有jar包   
        - Solr的扩展服务包 5个:solr-4.10.3-->example-->lib-->ext目录下的jar包
        - 有一个重复的:slf4j-api-1.7.6.jar,所以总共:13个
        
    * 使用solrj完成索引维护
        - 添加/修改索引
            ** 在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。
            ** 步骤:
                1、    创建HttpSolrServer对象,通过它和Solr服务器建立连接。
                2、    创建SolrInputDocument对象,然后通过它来添加域。
                3、    通过HttpSolrServer对象将SolrInputDocument添加到索引库。
                4、    提交。
            ** 代码:

@Test
publicvoidaddDocument() throws Exception {
    // 1、创建HttpSolrServer对象,通过它和Solr服务器建立连接。
    // 参数:solr服务器的访问地址
    HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
    // 2、创建SolrInputDocument对象,然后通过它来添加域。
    SolrInputDocument document = new SolrInputDocument();
    // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
    // 第二个参数:域的值
    // 注意:id的域不能少
    document.addField("id", "c0001");
    document.addField("title_ik", "使用solrJ添加的文档");
    document.addField("content_ik", "文档的内容");
    document.addField("product_name", "商品名称");
    // 3、通过HttpSolrServer对象将SolrInputDocument添加到索引库。
    server.add(document);
    // 4、提交。
    server.commit();
}

  - 删除索引(根据id来删除索引)

@Test 
public void deleteIndext() throws Exception {
    //创建HttpSolrServer
    HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
    //根据指定的id删除索引
    server.deleteById("c001");
    //提交
    server.commit();        
}

        - 删除索引(根据条件删除)

@Test 
public void deleteIndext() throws Exception {
    //创建HttpSolrServer
    HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
    //根据条件删除
    server.deleteByQuery("id:c001");
    //server.deleteByQuery("*:*");//删除所有,慎用
    //提交
    server.commit();        
}

        - 查询索引(简单查询)

@Test
publicvoidqueryIndex() throws Exception {
    // 创建HttpSolrServer对象
    HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");

    // 创建SolrQuery对象
    SolrQuery query = new SolrQuery();
    // 设置查询条件,名称“q”是固定的且必须的
    query.set("q", "id:2");
    //query.setQuery("product_name:小黄人");
    // 调用server的查询方法,查询索引库
    QueryResponse response = server.query(query);

    // 查询结果
    SolrDocumentList results = response.getResults();

    // 查询结果总数
    long count = results.getNumFound();
    System.out.println("查询结果总数:" + count);

    for (SolrDocument solrDocument : results) {
        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"));

    }
}

        - 查询索引(复杂查询)

    ** q - 查询关键字,必须的,如果查询所有使用*:*。
            ** fq - (filter query)过滤查询,作用:在q查询符合结果中同时是fq查询符合的
            ** sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]。。。
            ** start - 分页显示使用,开始记录下标,从0开始
            ** rows - 指定返回结果最多有多少条记录,配合start来实现分页。
                实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
            ** fl - 指定返回那些字段内容,用逗号或空格分隔多个。
            **  df-指定一个搜索Field
                也可以在SolrCore目录中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
            ** wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
            ** hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。

            ** 代码:

@Test
public void search02() throws Exception {
    // 创建HttpSolrServer
    HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
    // 创建SolrQuery对象
    SolrQuery query = new SolrQuery();

    // 输入查询条件
    query.setQuery("product_name:小黄人");
    // query.set("q", "product_name:小黄人");

    // 设置过滤条件
    // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq)
    query.setFilterQueries("product_price:[1 TO 10]");

    // 设置排序
    query.setSort("product_price", ORDER.asc);
    
    // 设置分页信息(使用默认的)
    query.setStart(0);
    query.setRows(10);

    // 设置显示的Field的域集合
    query.setFields("id,product_name,product_catalog,product_price,product_picture");

    // 设置默认域
    query.set("df", "product_keywords");

    // 设置高亮信息
    query.setHighlight(true);
    query.addHighlightField("product_name");
    query.setHighlightSimplePre("<em>");
    query.setHighlightSimplePost("</em>");

    // 执行查询并返回结果
    QueryResponse response = server.query(query);
    // 获取匹配的所有结果
    SolrDocumentList list = response.getResults();
    // 匹配结果总数
    long count = list.getNumFound();
    System.out.println("匹配结果总数:" + count);

    // 获取高亮显示信息
    Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
    for (SolrDocument doc : list) {
        System.out.println(doc.get("id"));

        List<String> list2 = highlighting.get(doc.get("id")).get(
                "product_name");
        if (list2 != null)
            System.out.println("高亮显示的商品名称:" + list2.get(0));
        else {
            System.out.println(doc.get("product_name"));
        }

        System.out.println(doc.get("product_catalog"));
        System.out.println(doc.get("product_price"));
        System.out.println(doc.get("product_picture"));
        System.out.println("=====================");
    }
}

 

10、案例:使用Solr实现电商网站中商品信息搜索功能    <--返回目录

    * 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序,同时还可以分页。
    * UI分析:分析页面,从而知道需要实现的功能,需要使用什么技术
    
    * 架构分析:
        应用服务器服务端:
            表现层:使用springmvc接收前台搜索页面的查询条件等信息
            业务层:调用dao层完成数据库持久化
                    如果数据库数据发生变化,调用solrj的客户端同步索引库。
            Dao层:使用mybatis完成数据库持久化

        Solrj服务器:
            提供搜索和索引服务

        数据库服务器:【本项目不用,本项目仅仅是做页面展示,不走MySQL数据库】
            提供数据库服务

    * 工程搭建
        - Solrj的依赖包和核心包 8+1个:solr-4.10.3/dist目录下solr-solrj-4.10.3.jar和solrj-lib下所有jar包   
        - Solr的扩展服务包 5个:solr-4.10.3-->example-->lib-->ext目录下的jar包
        - 有一个重复的:slf4j-api-1.7.6.jar,所以总共:13个
        - springmvc运行需要的jar包

    * 新建config目录,创建log4j.properties
        - 将solr-4.10.3-->example-->resources目录下的log4j.properties复制到WEB-INF-->classes目录下
        - 可以将INFO改成DEBUG

 

  ProductController

@Controller
public class ProductController {

    @Autowired
    private ProductService service;

    @RequestMapping("/list")
    public String list(String queryString, String catalog_name, String price,
            String sort, Integer page, Model model) throws Exception {
        ResultModel rm = service.getProducts(queryString, catalog_name, price,
                sort, page);

        // 将查询结果放到request域
        model.addAttribute("result", rm);

        // 简单类型的数据回显
        model.addAttribute("queryString", queryString);
        model.addAttribute("catalog_name", catalog_name);
        model.addAttribute("price", price);
        model.addAttribute("sort", sort);
        model.addAttribute("page", page);

        return "product_list";
    }

}

  ProductServiceImpl:solr搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序,同时还可以分页

@Service
public class ProductServiceImpl implements ProductService {

    // 依赖注入HttpSolrServer
    @Autowired
    private HttpSolrServer server;

    @Override
    public ResultModel getProducts(String queryString, String catalogName,
            String price, String sort, Integer page) throws Exception {
        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();

        // 输入关键字
        if (StringUtils.isNotEmpty(queryString)) {
            query.setQuery(queryString);
        } else {
            query.setQuery("*:*");
        }

        // 输入商品分类过滤条件
        if (StringUtils.isNotEmpty(catalogName)) {
            query.addFilterQuery("product_catalog_name:" + catalogName);
        }

        // 输入价格区间过滤条件
        // price的值:0-9 10-19
        if (StringUtils.isNotEmpty(price)) {
            String[] ss = price.split("-");
            if (ss.length == 2) {
                query.addFilterQuery("product_price:[" + ss[0] + " TO " + ss[1]
                        + "]");
            }
        }

        // 设置排序
        if ("1".equals(sort)) {
            query.setSort("product_price", ORDER.desc);
        } else {
            query.setSort("product_price", ORDER.asc);
        }

        // 设置分页信息
        if (page == null)
            page = 1;

        query.setStart((page - 1) * 20);
        query.setRows(20);

        // 设置默认域
        query.set("df", "product_keywords");

        // 设置高亮信息
        query.setHighlight(true);
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<font style=\"color:red\" >");
        query.setHighlightSimplePost("</font>");

        QueryResponse response = server.query(query);
        // 查询出的结果
        SolrDocumentList results = response.getResults();
        // 记录总数
        long count = results.getNumFound();

        List<Products> products = new ArrayList<>();
        Products prod;

        // 获取高亮信息
        Map<String, Map<String, List<String>>> highlighting = response
                .getHighlighting();
        for (SolrDocument doc : results) {
            prod = new Products();

            // 商品ID
            prod.setPid(doc.get("id").toString());

            List<String> list = highlighting.get(doc.get("id")).get(
                    "product_name");
            // 商品名称
            if (list != null)
                prod.setName(list.get(0));
            else {
                prod.setName(doc.get("product_name").toString());
            }

            // 商品价格
            prod.setPrice(Float.parseFloat(doc.get("product_price").toString()));
            // 商品图片地址
            prod.setPicture(doc.get("product_picture").toString());

            products.add(prod);
        }

        // 封装ResultModel对象
        ResultModel rm = new ResultModel();
        rm.setProductList(products);
        rm.setCurPage(page);
        rm.setRecordCount(count);

        int pageCount = (int) (count / 20);

        if (count % 20 > 0)
            pageCount++;
        // 设置总页数
        rm.setPageCount(pageCount);

        return rm;
    }
}

  Products

public class Products {
    private String pid; // 商品编号
    private String name; // 商品名称
    private String catalog_name; // 商品分类名称
    private float price; // 价格
    private String description; // 商品描述
    private String picture; // 图片名称
}

  ResultModel

public class ResultModel {
    private List<Products> productList; // 商品列表
    private Long recordCount; // 商品总数
    private int pageCount; // 总页数
    private int curPage; // 当前页
}

---

posted on 2021-01-26 22:34  wenbin_ouyang  阅读(145)  评论(0)    收藏  举报