ElasticSearch搜索实战仿京东搜索

该博客主要介绍了如何基于Java后端实现京东商城页面的模拟,并通过爬虫获取数据。首先,创建项目并设置相关配置,如关闭Thymeleaf缓存。然后,解析网页数据并使用Vue.js进行前端展示。接着,通过编写配置类和Service层代码,结合Elasticsearch建立索引,将爬取的数据存入ES。最后,实现了搜索高亮功能,确保前端与后端数据的绑定和交互正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:只有后端,没有前端,可以观看以下视频学习
狂神视频

1、项目搭建

京东商城首页

  1. 创建项目(修改版本,如果版本本身没有问题就不用改)
    在这里插入图片描述

  2. pom文件
    在这里插入图片描述

  3. 关闭thymeleaf的缓存
    在这里插入图片描述

  4. 导入老师给的前端页面资源(资源我没找到)
    在这里插入图片描述
    前端页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
 
<head>
    <meta charset="utf-8"/>
    <title>狂神说Java-ES仿京东实战</title>
    <link rel="stylesheet" th:href="@{/css/style.css}"/>
 
</head>
 
<body class="pg">
<div class="page" id="app">
    <div id="mallPage" class=" mallist tmall- page-not-market ">
 
        <!-- 头部搜索 -->
        <div id="header" class=" header-list-app">
            <div class="headerLayout">
                <div class="headerCon ">
                    <!-- Logo-->
                    <h1 id="mallLogo">
                        <img th:src="@{/images/jdlogo.png}" alt="">
                    </h1>
 
                    <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" value="dd" 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="result in results">
                        <div class="product-iWrap">
                            <!--商品封面-->
                            <div class="productImg-wrap">
                                <a class="productImg">
                                    <img :src="result.img">
                                </a>
                            </div>
                            <!--价格-->
                            <p class="productPrice">
                                <em>{{result.price}}</em>
                            </p>
                            <!--标题-->
                            <p class="productTitle">
                                <a v-html="result.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>
 
<script th:src="@{/js/axios.min.js}"></script>
<script th:src="@{/js/vue.min.js}"></script>
<script>
    new Vue(
        {
            el: '#app',
            data: {
                keyword: '', //搜索的关键字
                results: [] //搜索结果
            },
            methods: {
                 searchKey(){
                    var keyword = this.keyword;
                    console.log(keyword);
                    //对接后端的接口
                     axios.get('search/'+keyword+"/1/10").then(response=>{
                        console.log(response.data);
                        this.results = response.data; // 绑定数据!
                 })
                }
            }
        }
    )
</script>
 
</body>
</html>
  1. 写controller测试一下项目可不可以
    在这里插入图片描述
  2. 启动项目测试出现以下页面
    在这里插入图片描述

2、爬取数据

爬取数据(获取请求返回的页面信息,筛选出我们想要的数据就可以了)

数据问题?数据库获取,消息队列中获取,都可以成为数据源,现在可以 爬虫获取数据!

  1. pom文件中添加jsoup依赖
    在这里插入图片描述

  2. 编写解析网页的工具类
    在这里插入图片描述
    J_goodsList是在京东页面查看源代码找出来的
    在这里插入图片描述
    输出一下可以看到这些内容
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 创建实体类
    在这里插入图片描述

  4. 修改上面的工具类:
    在这里插入图片描述
    在这里插入图片描述

  5. 运行输出结果:
    在这里插入图片描述

3、业务编写

  1. 编写config配置类,spring整合es
    在这里插入图片描述
  2. 在Elasticsearch新建索引jd_goods
    在这里插入图片描述
  3. service层
    在这里插入图片描述
    上面这个不能使用main方法来进行测试,因为使用了spring容器。所以将上面的main方法删除,具体代码如下图所示:
    在这里插入图片描述
  4. controller层
    在这里插入图片描述
  5. 启动项目测试
    一开始jd_goods索引里是没有东西的
    在这里插入图片描述
    解析数据之后,数据就存到jd_goods索引里了
    在这里插入图片描述
    刷新Elasticsearch就可以看到数据了,但是有时候数据出现不完全,可以多刷新几次
    在这里插入图片描述
    这样之后后端的数据就入库了
  6. 解析获取这些数据,继续在service层写代码
    在这里插入图片描述
    在这里插入图片描述
  7. controller层继续添加如下代码
    在这里插入图片描述
  8. 启动项目测试
    在这里插入图片描述

4、绑定前端

前端使用vue完成前后端分离,这里省略,没有前端代码,视频可以看这里:
https://www.bilibili.com/video/BV1Nk4y1R7Hf?p=4&spm_id_from=pageDriver

5、搜索高亮

  1. service层加入高亮代码:
    在这里插入图片描述
  2. 修改service层的代码用于解析高亮:
    在这里插入图片描述
  3. 修改前端代码启动即可看到高亮部分
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值