Jingdong search --es y springboot más front-end vue

1. Crea un proyecto springboot

2. Agregar dependencias

  <!--转json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.79</version>
        </dependency>
        <dependency>
            <groupId>repMaven.org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version> 1.10.2</version>
        </dependency>

3. Crea un proyecto vue

3.1 Abra cmd e ingrese el comando

 vista de la interfaz de usuario

3.2 Crear un proyecto vue

 

3.3 Agregar dependencias y complementos

3.3.1 Complemento Agregar elemento

 3.3.2 Agregar dependencia axios

4. Use webStorm para abrir el proyecto vue

4.1 Introducción a axios

 

5. Código de front-end

 Este código se hará popular, pero no afectará nuestra operación

<template>
  <div class="page">
    <div id="app" class=" mallist tmall- page-not-market ">
      <!-- 头部搜索 -->
      <div id="header" class=" header-list-app">
        <div class="headerLayout">
          <div class="headerCon ">
            <div class="header-extra">
              <!--搜索-->
              <div id="mallSearch" class="mall-search">
                <form name="searchTop" class="mallSearch-form clearfix">
                  <fieldset>
                    <legend>天猫搜索</legend>
                    <div class="mallSearch-input clearfix">
                      <div class="s-combobox" id="s-combobox-685">
                        <div class="s-combobox-input-wrap">
                          <input v-model="keyword"  type="text" autocomplete="off" id="mq"
                                 class="s-combobox-input"  aria-haspopup="true">
                        </div>
                      </div>
                      <button type="submit" @click.prevent="searchKey" id="searchbtn">搜索</button>
                    </div>
                  </fieldset>
                </form>
                <ul class="relKeyTop">
                  <li><a>老闫说Java</a></li>
                  <li><a>老闫说前端</a></li>
                  <li><a>老闫说Linux</a></li>
                  <li><a>老闫说大数据</a></li>
                  <li><a>老闫聊理财</a></li>
                </ul>
              </div>
            </div>
          </div>
        </div>
      </div>
      <!-- 商品详情页面 -->
      <div id="content">
        <div class="main">
          <!-- 品牌分类 -->
          <form class="navAttrsForm">
            <div class="attrs j_NavAttrs" style="display:block">
              <div class="brandAttr j_nav_brand">
                <div class="j_Brand attr">
                  <div class="attrKey">
                    品牌
                  </div>
                  <div class="attrValues">
                    <ul class="av-collapse row-2">
                      <li><a href="#"> 老闫说 </a></li>
                      <li><a href="#"> Java </a></li>
                    </ul>
                  </div>
                </div>
              </div>
            </div>
          </form>
          <!-- 排序规则 -->
          <div class="filter clearfix">
            <a class="fSort fSort-cur">综合<i class="f-ico-arrow-d"></i></a>
            <a class="fSort">人气<i class="f-ico-arrow-d"></i></a>
            <a class="fSort">新品<i class="f-ico-arrow-d"></i></a>
            <a class="fSort">销量<i class="f-ico-arrow-d"></i></a>
            <a class="fSort">价格<i class="f-ico-triangle-mt"></i><i class="f-ico-triangle-mb"></i></a>
          </div>
          <!-- 商品详情 -->
          <div class="view grid-nosku" >
            <div class="product" v-for="item in results">
              <div class="product-iWrap">
                <!--商品封面-->
                <div class="productImg-wrap">
                  <a class="productImg">
                    <img :src="item.imgUrl">
                  </a>
                </div>
                <!--价格-->
                <p class="productPrice">
                  <em>{
   
   {item.price}}</em>
                </p>
                <!--标题-->
                <p class="productTitle">
                  <a v-html="item.title">  </a>
                </p>
                <!-- 店铺名 -->
                <div class="productShop">
                  <span>店铺: 老闫说Java </span>
                </div>
                <!-- 成交信息 -->
                <p class="productStatus">
                  <span>月成交<em>999笔</em></span>
                  <span>评价 <a>3</a></span>
                </p>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: "jd",
    data(){
      return {
        keyword: '', // 搜索的关键字
        results:[] // 后端返回的结果
      }
    },
    methods:{
      searchKey(){
        this.axios.get('/product/search/'+this.keyword).then(response=>{
          console.log(response.data.data);
          this.results=response.data.data;
        })
      }
    }

  }
</script>

<style>
  /*** uncss> filename: http://localhost:9090/css/global.css ***/body,button,fieldset,form,h1,input,legend,li,p,ul{margin:0;padding:0}body,button,input{font:12px/1.5 tahoma,arial,"\5b8b\4f53";-ms-overflow-style:scrollbar}button,h1,input{font-size:100%}em{font-style:normal}ul{list-style:none}a{text-decoration:none}a:hover{text-decoration:underline}legend{color:#000}fieldset,img{border:0}#content,#header{margin-left:auto;margin-right:auto}html{zoom:expression(function(ele){ ele.style.zoom = "1"; document.execCommand("BackgroundImageCache", false, true); }(this))}@font-face{font-family:mui-global-iconfont;src:url(//at.alicdn.com/t/font_1401963178_8135476.eot);src:url(//at.alicdn.com/t/font_1401963178_8135476.eot?#iefix) format('embedded-opentype'),url(//at.alicdn.com/t/font_1401963178_8135476.woff) format('woff'),url(//at.alicdn.com/t/font_1401963178_8135476.ttf) format('truetype'),url(//at.alicdn.com/t/font_1401963178_8135476.svg#iconfont) format('svg')}#mallPage{width:auto;min-width:990px;background-color:transparent}#content{width:990px;margin:auto}#mallLogo{float:left;z-index:9;padding-top:28px;width:280px;height:64px;line-height:64px;position:relative}.page-not-market #mallLogo{width:400px}.clearfix:after,.clearfix:before,.headerCon:after,.headerCon:before{display:table;content:"";overflow:hidden}#mallSearch legend{display:none}.clearfix:after,.headerCon:after{clear:both}.clearfix,.headerCon{zoom:1}#mallPage #header{margin-top:-30px;width:auto;margin-bottom:0;min-width:990px;background:#fff}#header{height:122px;margin-top:-26px!important;background:#fff;min-width:990px;width:auto!important;position:relative;z-index:1000}#mallSearch #mq,#mallSearch fieldset,.mallSearch-input{position:relative}.headerLayout{width:990px;padding-top:26px;margin:0 auto}.header-extra{overflow:hidden}#mallSearch{float:right;padding-top:25px;width:390px;overflow:hidden}.mallSearch-form{border:solid #FF0036;border-width:3px 0 3px 3px}.mallSearch-input{background:#fff;height:30px}#mallSearch #mq{color:#000;margin:0;z-index:2;width:289px;height:20px;line-height:20px;padding:5px 3px 5px 5px;outline:0;border:none;font-weight:900;background:url(data:image/gif;base64,R0lGODlhAQADAJEAAObm5t3d3ff39wAAACH5BAAAAAAALAAAAAABAAMAAAICDFQAOw==) repeat-x;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}#mallSearch button{position:absolute;right:0;top:0;width:90px;border:0;font-size:16px;letter-spacing:4px;cursor:pointer;color:#fff;background-color:#FF0036;height:30px;overflow:hidden;font-family:'\5FAE\8F6F\96C5\9ED1',arial,"\5b8b\4f53"}#mallSearch .s-combobox{height:30px}#mallSearch .s-combobox .s-combobox-input:focus{outline:0}button::-moz-focus-inner{border:0;padding:0;margin:0}.page-not-market #mallSearch{width:540px!important}.page-not-market #mq{width:439px!important}
  /*** uncss> filename: http://localhost:9090/css/test.css ***/#mallSearch{float:none}.page-not-market #mallLogo{width:280px}.header-list-app #mallSearch{width:448px!important}.header-list-app #mq{width:347px!important}@media (min-width:1210px){#header .headerCon,#header .headerLayout,.main{width:1190px!important}.header-list-app #mallSearch{width:597px!important}.header-list-app #mq{width:496px!important}}@media (min-width:600px) and (max-width:800px) and (orientation:portrait){.pg .page{min-width:inherit!important}.pg #mallPage,.pg #mallPage #header{min-width:740px!important}.pg #header .headerCon,.pg #header .headerLayout,.pg .main{width:740px!important}.pg #mallPage #mallLogo{width:260px}.pg #header{min-width:inherit}.pg #mallSearch .mallSearch-input{padding-right:95px}.pg #mallSearch .s-combobox{width:100%!important}.pg #mallPage .header-list-app #mallSearch{width:auto!important}.pg #mallPage .header-list-app #mallSearch #mq{width:100%!important;padding:5px 0 5px 5px}}i{font-style:normal}.main,.page{position:relative}.page{overflow:hidden}@font-face{font-family:tm-list-font;src:url(//at.alicdn.com/t/font_1442456441_338337.eot);src:url(//at.alicdn.com/t/font_1442456441_338337.eot?#iefix) format('embedded-opentype'),url(//at.alicdn.com/t/font_1442456441_338337.woff) format('woff'),url(//at.alicdn.com/t/font_1442456441_338337.ttf) format('truetype'),url(//at.alicdn.com/t/font_1442456441_338337.svg#iconfont) format('svg')}::selection{background:rgba(0,0,0,.1)}*{-webkit-tap-highlight-color:rgba(0,0,0,.3)}b{font-weight:400}.page{background:#fff;min-width:990px}#content{margin:0!important;width:100%!important}.main{margin:auto;width:990px}.main img{-ms-interpolation-mode:bicubic}.fSort i{background:url(//img.alicdn.com/tfs/TB1XClLeAY2gK0jSZFgXXc5OFXa-165-206.png) 9999px 9999px no-repeat}#mallSearch .s-combobox{width:auto}::-ms-clear,::-ms-reveal{display:none}.attrKey{white-space:nowrap;text-overflow:ellipsis}.attrs{border-top:1px solid #E6E2E1}.attrs a{outline:0}.attr{background-color:#F7F5F5;border-color:#E6E2E1 #E6E2E1 #D1CCC7;border-style:solid solid dotted;border-width:0 1px 1px}.attr ul:after,.attr:after{display:block;clear:both;height:0;content:' '}.attrKey{float:left;padding:7px 0 0;width:10%;color:#B0A59F;text-indent:13px}.attrKey{display:block;height:16px;line-height:16px;overflow:hidden}.attrValues{position:relative;float:left;background-color:#FFF;width:90%;padding:4px 0 0;overflow:hidden}.attrValues ul{position:relative;margin-right:105px;margin-left:25px}.attrValues ul.av-collapse{overflow:hidden}.attrValues li{float:left;height:22px;line-height:22px}.attrValues li a{position:relative;color:#806F66;display:inline-block;padding:1px 20px 1px 4px;line-height:20px;height:20px;white-space:nowrap}.attrValues li a:hover{color:#ff0036;text-decoration:none}.brandAttr .attr{border:2px solid #D1CCC7;margin-top:-1px}.brandAttr .attrKey{padding-top:9px}.brandAttr .attrValues{padding-top:6px}.brandAttr .av-collapse{overflow:hidden;max-height:60px}.brandAttr li{margin:0 8px 8px 0}.brandAttr li a{text-overflow:ellipsis;overflow:hidden}.navAttrsForm{position:relative}.relKeyTop{padding:4px 0 0;margin-left:-13px;height:16px;overflow:hidden;width:100%}.relKeyTop li{display:inline-block;border-left:1px solid #ccc;line-height:1.1;padding:0 12px}.relKeyTop li a{color:#999}.relKeyTop li a:hover{color:#ff0036;text-decoration:none}.filter i{display:inline-block;overflow:hidden}.filter{margin:10px 0;padding:5px;position:relative;z-index:10;background:#faf9f9;color:#806f66}.filter i{position:absolute}.filter a{color:#806f66;cursor:pointer}.filter a:hover{color:#ff0036;text-decoration:none}.fSort{float:left;height:22px;line-height:20px;line-height:24px\9;border:1px solid #ccc;background-color:#fff;z-index:10}.fSort{position:relative}.fSort{display:inline-block;margin-left:-1px;overflow:hidden;padding:0 15px 0 5px}.fSort:hover,a.fSort-cur{color:#ff0036;background:#F1EDEC}.fSort i{top:6px;right:5px;width:7px;height:10px;line-height:10px}.fSort .f-ico-arrow-d{background-position:-22px -23px}.fSort-cur .f-ico-arrow-d,.fSort:hover .f-ico-arrow-d{background-position:-30px -23px}i.f-ico-triangle-mb,i.f-ico-triangle-mt{border:4px solid transparent;height:0;width:0}i.f-ico-triangle-mt{border-bottom:4px solid #806F66;top:2px}i.f-ico-triangle-mb{border-top:4px solid #806F66;border-width:3px\9;right:6px\9;top:12px}:root i.f-ico-triangle-mb{border-width:4px\9;right:5px\9}i.f-ico-triangle-mb,i.f-ico-triangle-mt{border:4px solid transparent;height:0;width:0}i.f-ico-triangle-mt{border-bottom:4px solid #806F66;top:2px}i.f-ico-triangle-mb{border-top:4px solid #806F66;border-width:3px\9;right:6px\9;top:12px}:root i.f-ico-triangle-mb{border-width:4px\9;right:5px\9}.view:after{clear:both;content:' '}.productImg,.productPrice em b{vertical-align:middle}.product{position:relative;float:left;padding:0;margin:0 0 20px;line-height:1.5;overflow:visible;z-index:1}.product:hover{overflow:visible;z-index:3;background:#fff}.product-iWrap{position:absolute;background-color:#fff;margin:0;padding:4px 4px 0;font-size:0;border:1px solid #f5f5f5;border-radius:3px}.product-iWrap *{font-size:12px}.product:hover .product-iWrap{height:auto;margin:-3px;border:4px solid #ff0036;border-radius:0;-webkit-transition:border-color .2s ease-in;-moz-transition:border-color .2s ease-in;-ms-transition:border-color .2s ease-in;-o-transition:border-color .2s ease-in;transition:border-color .2s ease-in}.productPrice,.productShop,.productStatus,.productTitle{display:block;overflow:hidden;margin-bottom:3px}.view:after{display:block}.view{margin-top:10px}.view:after{height:0}.productImg-wrap{display:table;table-layout:fixed;height:210px;width:100%;padding:0;margin:0 0 5px}.productImg-wrap a,.productImg-wrap img{max-width:100%;max-height:210px}.productImg{display:table-cell;width:100%;text-align:center}.productImg img{display:block;margin:0 auto}.productPrice{font-family:arial,verdana,sans-serif!important;color:#ff0036;font-size:14px;height:30px;line-height:30px;margin:0 0 5px;letter-spacing:normal;overflow:inherit!important;white-space:nowrap}.productPrice *{height:30px}.productPrice em{float:left;font-family:arial;font-weight:400;font-size:20px;color:#ff0036}.productPrice em b{margin-right:2px;font-weight:700;font-size:14px}.productTitle{display:block;color:#666;height:14px;line-height:12px;margin-bottom:3px;word-break:break-all;font-size:0;position:relative}.productTitle *{font-size:12px;font-family:\5FAE\8F6F\96C5\9ED1;line-height:14px}.productTitle a{color:#333}.productTitle a:hover{color:#ff0036!important}.productTitle a:visited{color:#551A8B!important}.product:hover .productTitle{height:14px}.productShop{position:relative;height:22px;line-height:20px;margin-bottom:5px;color:#999;white-space:nowrap;overflow:visible}.productStatus{position:relative;height:32px;border:none;border-top:1px solid #eee;margin-bottom:0;color:#999}.productStatus span{float:left;display:inline-block;border-right:1px solid #eee;width:39%;padding:10px 1px;margin-right:6px;line-height:12px;text-align:left;white-space:nowrap}.productStatus a,.productStatus em{margin-top:-8px;font-family:arial;font-size:12px;font-weight:700}.productStatus em{color:#b57c5b}.productStatus a{color:#38b}.productImg-wrap{position:relative}.product-iWrap{min-height:98%;width:210px}.view{padding-left:5px;padding-right:5px}.view{width:1023px}.view .product{width:220px;margin-right:33px}@media (min-width:1210px){.view{width:1210px;padding-left:5px;padding-right:5px}.view .product{width:220px;margin-right:20px}}@media (min-width:600px) and (max-width:800px) and (orientation:portrait){.view{width:775px;padding-left:5px;padding-right:5px}.view .product{width:220px;margin-right:35px}}.product{height:372px}.grid-nosku .product{height:333px}

</style>

6. Código de fondo

6.1 Escribir una clase de herramienta - utilizada para obtener los datos de Jingdong

public class HtmlParseUtil {
    public List<Product> parseJd (String keyword)throws Exception{
        String path="https://search.jd.com/Search?keyword="+keyword;
        //Document整个网页对象
        Document parse = Jsoup.parse(new URL(path), 30000);
        //获取商品
        Element j_goodsList = parse.getElementById("J_goodsList");
        //获取每一个商品
        Elements li = j_goodsList.getElementsByTag("li");
        List<Product> list=new ArrayList<>();
        //循环
        for (Element element:li) {
            //获取下边为0的价格
            String p_price = element.getElementsByClass("p-price").eq(0).text();
            //获取商品的名字
            String p_name = element.getElementsByClass("p-name").eq(0).text();
            //System.out.println(p_name+""+p_price);
            //获取商品的图片  attr--属性
            String img = element.getElementsByTag("img").eq(0).attr("data-lazy-img");
           list.add(new Product(p_name,p_price,img));


        }
        return list;
    }
}

 6.3 Crear una clase de herramienta que devuelva datos comunes

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommentResult {
    private int code;
    private String msg;
    private Object data;
}

6.4 Agregue los datos obtenidos de Jingdong a es

6.4.1 capa de controlador

@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;
    //将京东的数据导入到es中
    @GetMapping("/export/{keyword}")
    public CommentResult product(@PathVariable String keyword) throws Exception {
        return  productService.export(keyword);
    }
}

6.4.2.capa de servicio

package com.guan.service;

import com.alibaba.fastjson.JSON;
import com.guan.entity.Product;
import com.guan.util.CommentResult;
import com.guan.util.HtmlParseUtil;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.List;

/**
 * TODO
 *
 * @author lenovo
 * @version 1.0
 * @since 2022-08-17  11:42:53
 */
@Service
public class ProductService {
    @Autowired
    //用来操作文档的
    private RestHighLevelClient client;
    //将京东的数据导入到es中
    public CommentResult export(String keyword) throws Exception{
        //调用工具类
        List<Product> list = HtmlParseUtil.parseJd(keyword);
        //数据量大,使用批量添加 bulk
        //先判断一下索引存在不存在
        GetIndexRequest getIndexRequest=new GetIndexRequest("jd");
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
        //如果没有索引,创建一个索引
        if (!exists){
            CreateIndexRequest createIndexRequest=new CreateIndexRequest("jd");
            client.indices().create(createIndexRequest,RequestOptions.DEFAULT);
        }
        //有索引就批量添加文档
        //创建一个bulkRequest对象
        BulkRequest bulkRequest=new BulkRequest("jd");
        //添加数据
        for (Product product:list) {
            IndexRequest indexRequest=new IndexRequest();
            indexRequest.source(JSON.toJSONString(product), XContentType.JSON);
            bulkRequest.add(indexRequest);
        }

        BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);

        //判断是否报错  报错返回的true 不报错返回的是false
        if (bulk.hasFailures()) {
            return new CommentResult(5000,"添加失败",null);
        }
        return new CommentResult(2000,"添加成功",null);
    }
}

6.4.3 Acceso

Tenga cuidado de no escribir caracteres chinos confusos

6.4.4 Pruébelo

6.5 Consulta de datos de es

6.5.1.controlador

 //查询数据从es中
    @GetMapping("/search/{keywaord}")
    public CommentResult search(@PathVariable String keyword)throws Exception{
        return productService.search(keyword);
        
    }

6.5.2.servicio

 //根据关键字搜索
    public CommentResult search(String keyword) throws Exception{
        //创建一个搜索请求对象
        SearchRequest searchRequest=new SearchRequest("jd");
        //创建一个条件对象
        SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
        //查询构造器
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        searchSourceBuilder.query(termQueryBuilder);
      
        //将条件对象放入到搜索请求对象中
        searchRequest.source(searchSourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        //将结果封装到hits中
        SearchHits hits = search.getHits();
        //获取总条数
        long value = hits.getTotalHits().value;
        //返回的是commentResult对象,但是在es中查询的时候是map类型
        List<Map<String,Object>> list=new ArrayList<>();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit:hits1) {
            //循环的时候拿到map
            Map<String, Object> map = searchHit.getSourceAsMap();
            list.add(map);
        }
        return new CommentResult(2000,"查询成功",list);
    }

6.5.3 Acceso

7. Utilice el acceso frontal

7.1 Informe de errores

7.2 Resolución de problemas

Agregue la anotación @CrossOrigin a la capa del controlador

 

8. Agrega destacados

 //根据关键字搜索
    public CommentResult search(String keyword) throws Exception{
        //创建一个搜索请求对象
        SearchRequest searchRequest=new SearchRequest("jd");
        //创建一个条件对象
        SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
        //查询构造器
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        searchSourceBuilder.query(termQueryBuilder);
        //设置高亮
        HighlightBuilder highlightBuilder=new HighlightBuilder();
        //设置那个列高亮
        highlightBuilder.field("title");
        //设置高亮的前置标签
        highlightBuilder.preTags("<font color='red'>");
        //设置高亮的后置标签
        highlightBuilder.postTags("</font>");
        //将高亮给条件对象
        searchSourceBuilder.highlighter(highlightBuilder);


        //将条件对象放入到搜索请求对象中
        searchRequest.source(searchSourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        //将结果封装到hits中
        SearchHits hits = search.getHits();
        //获取总条数
        long value = hits.getTotalHits().value;
        //返回的是commentResult对象,但是在es中查询的时候是map类型
        List<Map<String,Object>> list=new ArrayList<>();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit:hits1) {
            //循环的时候拿到map
            Map<String, Object> map = searchHit.getSourceAsMap();
            //获取高亮的字段
            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
            //获取文本
            HighlightField title = highlightFields.get("title");
            Text[] fragments = title.getFragments();
            StringBuffer sb=new StringBuffer();
            for (Text text:fragments) {
                sb.append(text);
            }
            map.put("title",sb);
            list.add(map);
        }
        return new CommentResult(2000,"查询成功",list);
    }

9. Añadir paginación

es muestra 10 elementos por página de forma predeterminada

9.1 Frontal

<!--分页
           @size-change:页面显示条数改变是触发的事件
           @current-change:页码改变时触发的事件
           current-page:当期的页面
           page-sizes:接受一个整形的数组,数组元素为显示的选择每页显示的个数
           page-size:每页显示的页数
           total:总条数
          -->
          <el-pagination
                  @size-change="handleSizeChange"
                  @current-change="handleCurrentChange"
                  :current-page="currentPage"
                  :page-sizes="pageSizes"
                  :page-size="pageSize"
                  :total="total"
                  layout="total, sizes, prev, pager, next, jumper">
          </el-pagination>
<script>
  export default {
    name: "jd",
    data(){
      return {
        //当前显示页面变量
        currentPage: 1,
        //接受一个整形的数组,数组元素为显示的选择每页显示的个数
        pageSizes: [5, 10, 15, 20],
        //每页显示的页数
        pageSize: 5,
        //总条数
        total: 0,
        keyword: '', // 搜索的关键字
        results:[] // 后端返回的结果
      }
    },
    methods:{
      handleSizeChange(val) {
        //每页显示的条数大小改变时触发的方法
        this.pageSize = val;
        this.searchKey();

      },
      //页码改变时触发的方法
      handleCurrentChange(val) {
        this.currentPage = val;
        this.searchKey();
      },
      searchKey(){
        this.axios.get('/product/search/'+this.keyword+"/"+this.currentPage+"/"+this.pageSize).then(response=>{
          console.log(response.data)
          this.total=response.data.data[0].total;
          this.results=response.data.data;
        })
      }
    }

  }

9.2 Back-end

9.2.1.capa de controlador

  //查询数据从es中
    @GetMapping("/search/{keyword}/{currentPage}/{pageSize}")
    public CommentResult search(@PathVariable String keyword,@PathVariable Integer currentPage,@PathVariable Integer pageSize)throws Exception{
        return productService.search(keyword,currentPage,pageSize);

    }

9.2.2.servicio

 //根据关键字搜索
    public CommentResult search(String keyword,Integer currentPage,Integer pageSize) throws Exception{
        //创建一个搜索请求对象
        SearchRequest searchRequest=new SearchRequest("jd");
        //创建一个条件对象
        SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
        //查询构造器
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        searchSourceBuilder.query(termQueryBuilder);
        //设置高亮
        HighlightBuilder highlightBuilder=new HighlightBuilder();
        //设置那个列高亮
        highlightBuilder.field("title");
        //设置高亮的前置标签
        highlightBuilder.preTags("<font color='red'>");
        //设置高亮的后置标签
        highlightBuilder.postTags("</font>");
        //将高亮给条件对象
        searchSourceBuilder.highlighter(highlightBuilder);
        //设置分页
        //从第几个开始出查询
        searchSourceBuilder.from((currentPage-1)*pageSize);
        //每页显示多少条
        searchSourceBuilder.size(pageSize);
        //将条件对象放入到搜索请求对象中
        searchRequest.source(searchSourceBuilder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        //将结果封装到hits中
        SearchHits hits = search.getHits();
        //获取总条数
        long value = hits.getTotalHits().value;
        //返回的是commentResult对象,但是在es中查询的时候是map类型
        List<Map<String,Object>> list=new ArrayList<>();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit:hits1) {
            //循环的时候拿到map
            Map<String, Object> map = searchHit.getSourceAsMap();

            //获取高亮的字段
            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
            //获取文本
            HighlightField title = highlightFields.get("title");
            Text[] fragments = title.getFragments();
            StringBuffer sb=new StringBuffer();
            for (Text text:fragments) {
                sb.append(text);
            }
            map.put("title",sb);
            //条件分页
            map.put("total",value);
            list.add(map);

        }
        return new CommentResult(2000,"查询成功",list);
    }

Supongo que te gusta

Origin blog.csdn.net/ne_123456/article/details/126372407
Recomendado
Clasificación