zoukankan      html  css  js  c++  java
  • 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:solrsolrhome</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.3examplesolr目录下的全部文件复制到<env-entry-value>E:solrsolrhome</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; // 当前页
    }

    ---

  • 相关阅读:
    mysql数据库常用命令
    二维码的生成--后台版
    软件构建--目录
    软件构建--项目总结
    软件构建--产品测试
    软件构建--产品研发
    软件构建--系统设计
    百度分享代码
    JS定时跳转URL并输出剩余秒数
    c#生成word文档
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/14332787.html
Copyright © 2011-2022 走看看