6.6 Elasticsearch(六)京淘项目改造

news2024/10/3 2:22:49

文章目录

  • 1.项目准备
  • 2.基础配置
    • 2.1 添加pom.xml依赖
    • 2.2 yml配置es服务器地址列表
  • 3.具体实现
    • 3.1 item实体类封装
    • 3.2 添加接口
    • 3.3 SearchController
  • 4.search.jsp界面
    • 4.1 搜索内容展示
    • 4.2 高亮内容样式设置
    • 4.3 搜索框内容回填
    • 4.4 添加上下页按钮


1.项目准备

我们切换回到此前的京淘项目,对京淘项目使用Elasticsearch技术进行改造:
在这里插入图片描述

在这里插入图片描述

此前我们在pd-web和pd-web-consumer中做了订单削峰,此次的改造,我们不涉及订单的相关业务,只需要对pd-web做改造,对商品完成搜索操作即可,首先运行pd-web模块,测试运行是否正常;

正常启动后,需要设置其工作空间为pd-web文件夹目录:
在这里插入图片描述

在这里插入图片描述

设置完成后重新启动,访问http://localhost/测试能否成功访问:
在这里插入图片描述

此次,我们就是要完成上方搜索功能的实现;

2.基础配置

2.1 添加pom.xml依赖

在pd-web项目的pom.xml中添加Elasticsearch和lombok的依赖:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

2.2 yml配置es服务器地址列表

在application.yml配置文件中添加es服务器地址列表:
在这里插入图片描述

3.具体实现

3.1 item实体类封装

package com.pd.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

@Document(indexName = "pditems")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Item {
    @Id
    private Long id;
    private String brand;
    private String title;
    @Field
    private String sellPoint;
    private String price;
    private String image;
}

我们通过@Document(indexName = "pditems")注解来确定实体类的索引数据具体来自哪里,通过@Id注解来表明当前字段为ID;当实体类中的名字与索引中的字段不一致时,通过@Field("sell_point")注解来建立俩者间的联系;

3.2 添加接口

我们添加ItemRepository接口,定义商品搜索方法:

package com.pd.es;

import com.pd.pojo.Item;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Highlight;
import org.springframework.data.elasticsearch.annotations.HighlightField;
import org.springframework.data.elasticsearch.annotations.HighlightParameters;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;

public interface ItemRepository extends ElasticsearchRepository<Item,Long> {

    //在title和sellpoint俩个字段中搜索
    @Highlight(
            parameters = @HighlightParameters(preTags = "<em>" ,postTags = "</em>"),
            fields = {@HighlightField(name = "title")}
    )
    List<SearchHit<Item>> findByTitleOrSellPoint(String key1, String key2, Pageable pageable);
}

接口中需要继承ElasticsearchRepository,并给定访问数据类型与ID的类型;

然后再添加SearchService定义具体的搜索方法:

package com.pd.service;

import com.pd.pojo.Item;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchHit;
import java.util.List;

public interface SearchService {
    List<SearchHit<Item>> search(String key, Pageable pageable);
}

以及其实现类SearchServiceImpl:

package com.pd.service.impl;

import com.pd.es.ItemRepository;
import com.pd.pojo.Item;
import com.pd.service.SearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SearchServiceImpl implements SearchService {
    @Autowired
    private ItemRepository itemRepository;
    @Override
    public List<SearchHit<Item>> search(String key, Pageable pageable) {
        return itemRepository.findByTitleOrSellPoint(key, key, pageable);
    }
}

用户在搜索框中输入关键词进行搜索时,实际只输入了一个关键词,但是我们要将关键词发送俩次,使用俩个key来接收它,用户商品搜索中名字以及卖点的关键字:
在这里插入图片描述

3.3 SearchController

package com.pd.controller;

import com.pd.pojo.Item;
import com.pd.service.SearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.ArrayList;
import java.util.List;

@Controller
public class SearchController {
    @Autowired
    private SearchService searchService;

    //?key=手机&page=0&size=20
    @GetMapping("/search/toSearch.html")
    public String search(Model model, String key, Pageable pageable) {
        // model对象用来向jsp传递数据的工具
        List<SearchHit<Item>> list = searchService.search(key, pageable);
        List<Item> items = zhuanHuan(list); //转换
        // items 集合传递到 jsp 进行显示
        // pageable 对象传递到 jsp 显示翻页
        model.addAttribute("items", items);
        model.addAttribute("p", pageable);

        return "/search.jsp";
    }

    private List<Item> zhuanHuan(List<SearchHit<Item>> list) {
        List<Item> items = new ArrayList<>();
        for (SearchHit<Item> sh : list) {
            Item item = sh.getContent(); //原始数据,没有高亮
            List<String> hlTitle = sh.getHighlightField("title"); //高亮title
            item.setTitle(pinJie(hlTitle));//高亮title替换原始的title数据
            items.add(item);
        }
        return items;
    }
    private String pinJie(List<String> hlTitle) {
        StringBuilder s = new StringBuilder();
        for (String s1 : hlTitle) {
            s.append(s1);
        }
        return s.toString();
    }
}

4.search.jsp界面

我们这里的项目不是前后端分离的项目,这里我们直接使用在webapp目录下的search.jsp界面,上面SearchController 中也将数据直接返回给了search.jsp;

4.1 搜索内容展示

接下来我们调整jsp页面的相关代码:
在这里插入图片描述

此时搜索结果已可以正确显示:
在这里插入图片描述

4.2 高亮内容样式设置

但是此时,我们设置的高亮显示的内容只是变为了斜体,并没有其他特殊样式,我们通过css样式设置来进行优化:,通过定位网页源代码我们可以看到,高亮显示的内容是在一个<div>标签中,且通过class分类为describe,内部在<p>标签中,且被<em>标签包裹着:
在这里插入图片描述

我们通过<style>标签并选择相关的标签内容进行颜色的css样式设置:

<style>
    div.describe p em {
        color: #f00;
    }
</style>

通过在search.jsp文件中添加css样式代码 ,重启项目后我们可以发现,我们设置的高亮显示内容已可以成功展现:

在这里插入图片描述

4.3 搜索框内容回填

我们可以看到,搜索框中的内容是通过包含另外一个header.jsp引入的:
在这里插入图片描述

通过一个判断语句,有关键词回填关键词,没有关键词回填提示语句:
在这里插入图片描述

我们将判断语句中的关键词匹配更改为正确的:
在这里插入图片描述

4.4 添加上下页按钮

我们通过判断当前页面在是否在第一页以后来添加上一页按钮;
通过判断当前页面数据大于等于20且页面数据不为0时添加下一页按钮;
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )

文章目录 一、继承中成员变量同名的处理方案1、继承中成员变量同名的场景说明2、使用域作用符区分同名成员变量 二、代码示例 - 继承中成员变量同名的处理方案 一、继承中成员变量同名的处理方案 1、继承中成员变量同名的场景说明 子类 继承 父类 的 成员 , 如果 子类 中定义了…

[数据分析与可视化] 基于Python绘制简单动图

动画是一种高效的可视化工具&#xff0c;能够提升用户的吸引力和视觉体验&#xff0c;有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图&#xff0c;另一种方法是基于Pillow生成…

2023年腾讯云双11活动入口及内容详细解读

2023年腾讯云11.11云上盛惠活动&#xff0c;海量产品轻松上云&#xff0c;免费领取9999元代金券礼包&#xff1b;云服务器、云数据库、COS等上云必备产品&#xff0c;低至1.8折起&#xff1b;云产品助力企业和开发者轻松上云&#xff01; 下面给大家分享腾讯云双11活动入口及活…

Android Jetpack重要吧?需要学习有这么多

Jetpack简单理解 2018年谷歌I/O 发布了一系列辅助Android开发者的实用工具&#xff0c;合称Jetpack&#xff0c;以帮助开发者构建出色的 Android 应用。 官方JetPack介绍 大体上&#xff0c;JetPack是Google推出的一些库的集合。是Android基础支持库SDK以外的部分。包含了组…

问题:Uncaught Error: “xxx“ is read-only

文章目录 问题分析 问题 控制台报错如下 分析 在这里使用了 const 定义常量 const声明一个只读的常量。一旦声明&#xff0c;常量的值就不能改变。 let是块级作用域&#xff0c;函数内部使用let定义后&#xff0c;对函数外部无影响。

【人工智能专栏】(2)知识表示方法 I

目录 1. 知识与知识表示1.1 什么是知识&#xff1f;1.2 什么是数据-信息-知识&#xff1f;1.3 人工智能系统所关心的知识1.4 什么是知识表示&#xff1f;1.5 知识表示要注意的问题1.6 AI对知识表示方法的要求 2. 状态空间法2.1 什么是状态空间法&#xff1f;2.2 状态空间法三要…

数据挖掘和大数据的区别

数据挖掘 一般用于对企业内部系统的数据库进行筛选、整合和分析。 操作对象是数据仓库&#xff0c;数据相对有规律&#xff0c;数据量较少。 大数据 一般指对互联网中杂乱无章的数据进行筛选、整合和分析。 操作对象一般是互联网的数据&#xff0c;数据无规律&#xff0c;…

关于Fragment的生命周期,你知道多少?

Fragment生命周期 Fragment是Android中用于构建用户界面的一种组件。 Fragment具有自己的生命周期&#xff0c;包括以下几个阶段&#xff1a; onAttach(): 当Fragment与Activity关联时调用&#xff0c;可以通过该方法获取到所关联的Activity的引用。 onCreate(): 在Fragment创…

13.4web自动化测试(Selenium3+Java)

一.定义 用来做web自动化测试的框架. 二.特点 1.支持各种浏览器. 2.支持各种平台(操作系统). 3.支持各种编程语言. 4.有丰富的api. 三.工作原理 四.搭环境 1.对照Chrome浏览器版本号,下载ChromeDriver,配置环境变量,我直接把.exe文件放在了jdk安装路径的bin文件夹下了(j…

最新Python深度学习技术进阶与应用

最新Python深度学习技术进阶与应用&#xff08;图神经网络&#xff09; 近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。为了帮助广…

网络第一课

✍ 如何理解局域网和广域网&#xff1f; ✍ 路由器和交换机是怎样工作的&#xff1f; ✍ 三层交换机能不能代替路由器&#xff1f; -- 1.局域网 2. 广域网 -- -- 企业网络 运营商架构 数据中心架构 -- 局域网 - 内网 - 私网 -- 通过交换机连接的 转发相同IP地址段的…

若依和芋道

国外卷技术,国内卷业务,做管理业务通常使用开源框架就可以快速满足,若依和芋道都是开源二开工具较为流行的框架,芋道是基于若依的,基本上是开发人员自己写业务开发框架的天花板,两者的前端都是基于vue-element-admin的,使用Gitee上两者的SpringBoot的最轻量化版本进行对…

Transformer 简单理解

文章目录 一、Transformer的架构一、编码1.1 词向量编码&#xff08;Input Embedding&#xff09;1.2 位置编码&#xff08;Positional Encoding&#xff09; 二、Mask2.1 PAD Mask2.2 上三角Mask 二、注意力计算2.1 Q、K、V 向量的生成2.2 自注意力计算流程2.2 单头注意力和多…

MTK OEM解锁步骤

1.在win10 首选安装驱动 插入usb线后&#xff0c;进入在设备管理器 里面看到 未识别黄色图标的 android 以后&#xff0c;右击点击更新驱动&#xff0c;然后安装解压后的驱动 同时在开发者模式里面的 oem解锁开关打开 2. adb 命令解锁步骤 1.adb reboot bootloader 2.fastbo…

Json字符串转换小工具

下载【免费】Json字符串格式化和压缩&#xff0c;支持数组元素的不换行且能转换成16进制资源-CSDN文库 推荐理由&#xff1a; 离线使用支持json字符串的数据格式化和压缩&#xff0c;如&#xff1a;图1支持数组元素的16进制转换&#xff0c;如&#xff1a;图2支持数组元素不换…

【AI视野·今日CV 计算机视觉论文速览 第272期】Fri, 20 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 20 Oct 2023 Totally 62 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Putting the Object Back into Video Object Segmentation Authors Ho Kei Cheng, Seoung Wug Oh, Brian Price, Joon Youn…

用长tree方式做等长线

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: 用set_data_check的方式做等长线 前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。 1)写一个sdc,把等长线的起点设置成clock source,用于创建create_…

网易云音乐下载的歌曲能永久听吗?超级简单!

网易云下载的歌曲当然可以永久听&#xff0c;只是因为网易云音乐是ncm格式&#xff0c;在很多平台不兼容&#xff0c;这时候就需要转换成兼容性更高的MP3格式&#xff0c;了解一些音频转换工具&#xff0c;就可以轻松搞定&#xff01; 方法一&#xff1a;使用野葱视频转换器 1…

Shor算法30年来首次重大改进!更快破解密码

&#xff08;图片来源&#xff1a;网络&#xff09; 1994年&#xff0c;美国麻省理工学院 (MIT) 的应用数学家 Peter Shor 实现了量子计算机的第一个实际应用&#xff1a;破译密码。他展示了在查找大质数的质因子时&#xff0c;量子计算机比传统计算机要快得多&#xff0c;查找…

AOP 笔记

AOP【面向切面编程】 作用&#xff1a;在不惊动原始设计的基础上进行功能增强。 无侵入式编程 连接点&#xff1a;程序执行的任意位置&#xff0c;SpringAOP中&#xff0c;理解为方法的执行。 切入点&#xff1a;匹配连接点的式子,要追加功能的方法 通知&#xff08;写在通…