代码编织梦想

黑马旅游案例

下面,我们通过黑马旅游的案例来实战演练下之前学习的知识。
资料:
代码资料

我们实现四部分功能:

  • 酒店搜索和分页
  • 酒店结果过滤
  • 我周边的酒店
  • 酒店竞价排名

启动我们提供的hotel-demo项目,其默认端口是8089,访问http://localhost:8090,就能看到项目页面了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wh4PMWOl-1679301990830)(assets/image-20210721223159598.png)]

一.酒店搜索和分页

案例需求:实现黑马旅游的酒店搜索功能,完成关键字搜索和分页

1.需求分析

在项目的首页,有一个大大的搜索框,还有分页按钮:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFxZGwLH-1679301990831)(assets/image-20210721223859419.png)]

点击搜索按钮,可以看到浏览器控制台发出了请求:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcGyf805-1679301990831)(assets/image-20210721224033789.png)]

请求参数如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvvTFcj5-1679301990832)(assets/image-20210721224112708.png)]

由此可以知道,我们这个请求的信息如下:

  • 请求方式:POST
  • 请求路径:/hotel/list
  • 请求参数:JSON对象,包含4个字段:
    • key:搜索关键字
    • page:页码
    • size:每页大小
    • sortBy:排序,目前暂不实现
  • 返回值:分页查询,需要返回分页结果PageResult,包含两个属性:
    • total:总条数
    • List<HotelDoc>:当前页的数据

因此,我们实现业务的流程如下:

  • 步骤一:定义实体类,接收请求参数的JSON对象
  • 步骤二:编写controller,接收页面的请求
  • 步骤三:编写业务实现,利用RestHighLevelClient实现搜索、分页

2.定义实体类

实体类有两个,一个是前端的请求参数实体,一个是服务端应该返回的响应结果实体。

1)请求参数

前端请求的json结构如下:

{
    "key": "搜索关键字",
    "page": 1,
    "size": 3,
    "sortBy": "default"
}

因此,我们在cn.itcast.hotel.pojo包下定义一个实体类:

package cn.itcast.hotel.pojo;

import lombok.Data;

@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
}

2)返回值

分页查询,需要返回分页结果PageResult,包含两个属性:

  • total:总条数
  • List<HotelDoc>:当前页的数据

因此,我们在cn.itcast.hotel.pojo中定义返回结果:

package cn.itcast.hotel.pojo;

import lombok.Data;

import java.util.List;

@Data
public class PageResult {
    private Long total;
    private List<HotelDoc> hotels;

    public PageResult() {
    }

    public PageResult(Long total, List<HotelDoc> hotels) {
        this.total = total;
        this.hotels = hotels;
    }
}

3.定义controller

定义一个HotelController,声明查询接口,满足下列要求:

  • 请求方式:Post
  • 请求路径:/hotel/list
  • 请求参数:对象,类型为RequestParam
  • 返回值:PageResult,包含两个属性
    • Long total:总条数
    • List<HotelDoc> hotels:酒店数据

因此,我们在cn.itcast.hotel.web中定义HotelController:

@RestController
@RequestMapping("/hotel")
public class HotelController {

    @Autowired
    private IHotelService hotelService;
	// 搜索酒店数据
    @PostMapping("/list")
    public PageResult search(@RequestBody RequestParams params){
        return hotelService.search(params);
    }
}

4.实现搜索业务

我们在controller调用了IHotelService,并没有实现该方法,因此下面我们就在IHotelService中定义方法,并且去实现业务逻辑。

1)在cn.itcast.hotel.service中的IHotelService接口中定义一个方法:

/**
 * 根据关键字搜索酒店信息
 * @param params 请求参数对象,包含用户输入的关键字 
 * @return 酒店文档列表
 */
PageResult search(RequestParams params);

2)实现搜索业务,肯定离不开RestHighLevelClient,我们需要把它注册到Spring中作为一个Bean。在cn.itcast.hotel中的HotelDemoApplication中声明这个Bean:

@Bean
public RestHighLevelClient client(){
    return  new RestHighLevelClient(RestClient.builder(
        HttpHost.create("http://192.168.150.101:9200")
    ));
}

3)在cn.itcast.hotel.service.impl中的HotelService中实现search方法:

@Override
public PageResult search(RequestParams params) {
    try {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        // 2.1.query
         BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        String key = params.getKey();
        if (key == null || "".equals(key)) {
            boolQuery.must(QueryBuilders.matchAllQuery());
        } else {
            boolQuery.must(QueryBuilders.matchQuery("all", key));
        }
        request.source().query(boolQuery);

        // 2.2.分页
        int page = params.getPage();
        int size = params.getSize();
        request.source().from((page - 1) * size).size(size);

        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        return handleResponse(response);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

// 结果解析
private PageResult handleResponse(SearchResponse response) {
    // 4.解析响应
    SearchHits searchHits = response.getHits();
    // 4.1.获取总条数
    long total = searchHits.getTotalHits().value;
    // 4.2.文档数组
    SearchHit[] hits = searchHits.getHits();
    // 4.3.遍历
    List<HotelDoc> hotels = new ArrayList<>();
    for (SearchHit hit : hits) {
        // 获取文档source
        String json = hit.getSourceAsString();
        // 反序列化
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
		// 放入集合
        hotels.add(hotelDoc);
    }
    // 4.4.封装返回
    return new PageResult(total, hotels);
}

二.酒店结果过滤

需求:添加品牌、城市、星级、价格等过滤功能

1.需求分析

在页面搜索框下面,会有一些过滤项:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5Nszds5-1679301990834)(assets/image-20210722091940726.png)]

传递的参数如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5JMNMz56-1679301990834)(assets/image-20210722092051994.png)]

包含的过滤条件有:

  • brand:品牌值
  • city:城市
  • minPrice~maxPrice:价格范围
  • starName:星级

我们需要做两件事情:

  • 修改请求参数的对象RequestParams,接收上述参数
  • 修改业务逻辑,在搜索条件之外,添加一些过滤条件

2.修改实体类

修改在cn.itcast.hotel.pojo包下的实体类RequestParams:

@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
    // 下面是新增的过滤条件参数
    private String city;
    private String brand;
    private String starName;
    private Integer minPrice;
    private Integer maxPrice;
}

3.修改搜索业务

在HotelService的search方法中,只有一个地方需要修改:requet.source().query( … )其中的查询条件。

在之前的业务中,只有match查询,根据关键字搜索,现在要添加条件过滤,包括:

  • 品牌过滤:是keyword类型,用term查询
  • 星级过滤:是keyword类型,用term查询
  • 价格过滤:是数值类型,用range查询
  • 城市过滤:是keyword类型,用term查询

多个查询条件组合,肯定是boolean查询来组合:

  • 关键字搜索放到must中,参与算分
  • 其它过滤条件放到filter中,不参与算分

因为条件构建的逻辑比较复杂,这里先封装为一个函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTVoYCxa-1679301990835)(assets/image-20210722092935453.png)]

buildBasicQuery的代码如下:

private void buildBasicQuery(RequestParams params, SearchRequest request) {
    // 1.构建BooleanQuery
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 2.关键字搜索
    String key = params.getKey();
    if (key == null || "".equals(key)) {
        boolQuery.must(QueryBuilders.matchAllQuery());
    } else {
        boolQuery.must(QueryBuilders.matchQuery("all", key));
    }
    // 3.城市条件
    if (params.getCity() != null && !params.getCity().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
    }
    // 4.品牌条件
    if (params.getBrand() != null && !params.getBrand().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
    }
    // 5.星级条件
    if (params.getStarName() != null && !params.getStarName().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
    }
	// 6.价格
    if (params.getMinPrice() != null && params.getMaxPrice() != null) {
        boolQuery.filter(QueryBuilders
                         .rangeQuery("price")
                         .gte(params.getMinPrice())
                         .lte(params.getMaxPrice())
                        );
    }
	// 7.放入source
    request.source().query(boolQuery);
}

三.我周边的酒店

需求:我附近的酒店

1.需求分析

在酒店列表页的右侧,有一个小地图,点击地图的定位按钮,地图会找到你所在的位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aEqghtKP-1679301990835)(assets/image-20210722093414542.png)]

并且,在前端会发起查询请求,将你的坐标发送到服务端:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fglzTU6p-1679301990836)(assets/image-20210722093642382.png)]

我们要做的事情就是基于这个location坐标,然后按照距离对周围酒店排序。实现思路如下:

  • 修改RequestParams参数,接收location字段
  • 修改search方法业务逻辑,如果location有值,添加根据geo_distance排序的功能

2.修改实体类

修改在cn.itcast.hotel.pojo包下的实体类RequestParams:

package cn.itcast.hotel.pojo;

import lombok.Data;

@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
    private String city;
    private String brand;
    private String starName;
    private Integer minPrice;
    private Integer maxPrice;
    // 我当前的地理坐标
    private String location;
}

3.距离排序API

我们以前学习过排序功能,包括两种:

  • 普通字段排序
  • 地理坐标排序

我们只讲了普通字段排序对应的java写法。地理坐标排序只学过DSL语法,如下:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": "asc"  
    },
    {
      "_geo_distance" : {
          "FIELD" : "纬度,经度",
          "order" : "asc",
          "unit" : "km"
      }
    }
  ]
}

对应的java代码示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aeAfQHXv-1679301990837)(assets/image-20210722095227059.png)]

4.添加距离排序

cn.itcast.hotel.service.implHotelServicesearch方法中,添加一个排序功能:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OnUtBYes-1679301990838)(assets/image-20210722095902314.png)]

完整代码:

@Override
public PageResult search(RequestParams params) {
    try {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        // 2.1.query
        buildBasicQuery(params, request);

        // 2.2.分页
        int page = params.getPage();
        int size = params.getSize();
        request.source().from((page - 1) * size).size(size);

        // 2.3.排序
        String location = params.getLocation();
        if (location != null && !location.equals("")) {
            request.source().sort(SortBuilders
                                  .geoDistanceSort("location", new GeoPoint(location))
                                  .order(SortOrder.ASC)
                                  .unit(DistanceUnit.KILOMETERS)
                                 );
        }

        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        return handleResponse(response);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

5.排序距离显示

重启服务后,测试我的酒店功能:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6116lJ27-1679301990838)(assets/image-20210722100040674.png)]

发现确实可以实现对我附近酒店的排序,不过并没有看到酒店到底距离我多远,这该怎么办?

排序完成后,页面还要获取我附近每个酒店的具体距离值,这个值在响应结果中是独立的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HB9x2eC5-1679301990839)(assets/image-20210722095648542.png)]

因此,我们在结果解析阶段,除了解析source部分以外,还要得到sort部分,也就是排序的距离,然后放到响应结果中。

我们要做两件事:

  • 修改HotelDoc,添加排序距离字段,用于页面显示
  • 修改HotelService类中的handleResponse方法,添加对sort值的获取

1)修改HotelDoc类,添加距离字段

package cn.itcast.hotel.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;
    // 排序时的 距离值
    private Object distance;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}

2)修改HotelService中的handleResponse方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wRQFU4HW-1679301990840)(assets/image-20210722100613966.png)]

重启后测试,发现页面能成功显示距离了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trK3csHS-1679301990840)(assets/image-20210722100838604.png)]

四.酒店竞价排名

需求:让指定的酒店在搜索结果中排名置顶

1.需求分析

要让指定酒店在搜索结果中排名置顶,效果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-grJwC5U0-1679301990841)(assets/image-20210722100947292.png)]

页面会给指定的酒店添加广告标记。

那怎样才能让指定的酒店排名置顶呢?

我们之前学习过的function_score查询可以影响算分,算分高了,自然排名也就高了。而function_score包含3个要素:

  • 过滤条件:哪些文档要加分
  • 算分函数:如何计算function score
  • 加权方式:function score 与 query score如何运算

这里的需求是:让指定酒店排名靠前。因此我们需要给这些酒店添加一个标记,这样在过滤条件中就可以根据这个标记来判断,是否要提高算分

比如,我们给酒店添加一个字段:isAD,Boolean类型:

  • true:是广告
  • false:不是广告

这样function_score包含3个要素就很好确定了:

  • 过滤条件:判断isAD 是否为true
  • 算分函数:我们可以用最简单暴力的weight,固定加权值
  • 加权方式:可以用默认的相乘,大大提高算分

因此,业务的实现步骤包括:

  1. 给HotelDoc类添加isAD字段,Boolean类型

  2. 挑选几个你喜欢的酒店,给它的文档数据添加isAD字段,值为true

  3. 修改search方法,添加function score功能,给isAD值为true的酒店增加权重

2.修改HotelDoc实体

cn.itcast.hotel.pojo包下的HotelDoc类添加isAD字段:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P3wh7FpV-1679301990842)(assets/image-20210722101908062.png)]

3.添加广告标记

接下来,我们挑几个酒店,添加isAD字段,设置为true:

POST /hotel/_update/1902197537
{
    "doc": {
        "isAD": true
    }
}
POST /hotel/_update/2056126831
{
    "doc": {
        "isAD": true
    }
}
POST /hotel/_update/1989806195
{
    "doc": {
        "isAD": true
    }
}
POST /hotel/_update/2056105938
{
    "doc": {
        "isAD": true
    }
}

4.添加算分函数查询

接下来我们就要修改查询条件了。之前是用的boolean 查询,现在要改成function_socre查询。

function_score查询结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYNy2Y13-1679301990842)(assets/image-20210721191544750.png)]

对应的JavaAPI如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yavx4SCA-1679301990843)(assets/image-20210722102850818.png)]

我们可以将之前写的boolean查询作为原始查询条件放到query中,接下来就是添加过滤条件算分函数加权模式了。所以原来的代码依然可以沿用。

修改cn.itcast.hotel.service.impl包下的HotelService类中的buildBasicQuery方法,添加算分函数查询:

private void buildBasicQuery(RequestParams params, SearchRequest request) {
    // 1.构建BooleanQuery
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 关键字搜索
    String key = params.getKey();
    if (key == null || "".equals(key)) {
        boolQuery.must(QueryBuilders.matchAllQuery());
    } else {
        boolQuery.must(QueryBuilders.matchQuery("all", key));
    }
    // 城市条件
    if (params.getCity() != null && !params.getCity().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
    }
    // 品牌条件
    if (params.getBrand() != null && !params.getBrand().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
    }
    // 星级条件
    if (params.getStarName() != null && !params.getStarName().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
    }
    // 价格
    if (params.getMinPrice() != null && params.getMaxPrice() != null) {
        boolQuery.filter(QueryBuilders
                         .rangeQuery("price")
                         .gte(params.getMinPrice())
                         .lte(params.getMaxPrice())
                        );
    }

    // 2.算分控制
    FunctionScoreQueryBuilder functionScoreQuery =
        QueryBuilders.functionScoreQuery(
        // 原始查询,相关性算分的查询
        boolQuery,
        // function score的数组
        new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
            // 其中的一个function score 元素
            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                // 过滤条件
                QueryBuilders.termQuery("isAD", true),
                // 算分函数
                ScoreFunctionBuilders.weightFactorFunction(10)
            )
        });
    request.source().query(functionScoreQuery);
}

就是添加过滤条件算分函数加权模式了。所以原来的代码依然可以沿用。

修改cn.itcast.hotel.service.impl包下的HotelService类中的buildBasicQuery方法,添加算分函数查询:

private void buildBasicQuery(RequestParams params, SearchRequest request) {
    // 1.构建BooleanQuery
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 关键字搜索
    String key = params.getKey();
    if (key == null || "".equals(key)) {
        boolQuery.must(QueryBuilders.matchAllQuery());
    } else {
        boolQuery.must(QueryBuilders.matchQuery("all", key));
    }
    // 城市条件
    if (params.getCity() != null && !params.getCity().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
    }
    // 品牌条件
    if (params.getBrand() != null && !params.getBrand().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
    }
    // 星级条件
    if (params.getStarName() != null && !params.getStarName().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
    }
    // 价格
    if (params.getMinPrice() != null && params.getMaxPrice() != null) {
        boolQuery.filter(QueryBuilders
                         .rangeQuery("price")
                         .gte(params.getMinPrice())
                         .lte(params.getMaxPrice())
                        );
    }

    // 2.算分控制
    FunctionScoreQueryBuilder functionScoreQuery =
        QueryBuilders.functionScoreQuery(
        // 原始查询,相关性算分的查询
        boolQuery,
        // function score的数组
        new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
            // 其中的一个function score 元素
            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                // 过滤条件
                QueryBuilders.termQuery("isAD", true),
                // 算分函数
                ScoreFunctionBuilders.weightFactorFunction(10)
            )
        });
    request.source().query(functionScoreQuery);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_53604412/article/details/129671010

黑马mysql百度云盘_黑马-百度云搜索引擎-爱代码爱编程

资源内容: 黑马|____阶段6 微服务社交平台【十次方】          |____17 项目完结          |____16 dockfile          |____15 SpringCloud之一统天下          |____14 SpringCloud之初入江湖          |____13 密码加密与微服务鉴权JWT

0-6分布式搜索引擎02-爱代码爱编程

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和RestClient实现搜索。 0.学习目标 1.DSL查询文档 e

分布式搜索引擎01-爱代码爱编程

分布式搜索引擎01 – elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索

分布式搜索引擎elasticsearch基本命令学习_每天都要加油呀!的博客-爱代码爱编程

文章目录 1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术?1.1.5.总结1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排1.3.es的一些概念1.3.1.文档和

sprinboot-黑马-笔记_weixin_45395760的博客-爱代码爱编程

SpringBoot----黑马视频地址 网盘链接:https://pan.baidu.com/s/1z8I4IXEuYBepDYbg4ijzUw 提取码:1234 1. 基础篇 1.快速上手SpringBoot 1.SpringBoot入门程序开发 隐藏指定文件/文件夹 2.

分布式搜索引擎elasticsearch讲解专题(二)_qq_469603589的博客-爱代码爱编程

   今天主要介绍索引库和文档的相关Rest操作,使用PostMan或者Kibbna来进行相关请求接口的调用,实现索引库的创建和维护,文档的添加和维护等。以及使用ES提供的API实现索引库和文档的CRUD操作。 3.索引库操作 索引库就类似数据库表,mapping映射就类似表的结构。 我们要向es中存储数据,必须先创建“库”和“表”。 3.1

【spring cloud】es实战:黑马旅游案例_骑着蜗牛ひ追导弹'的博客-爱代码爱编程

文章目录 黑马旅游案例1.1 酒店搜索和分页1.1.1 需求分析1.1.2 定义实体类1.1.3 定义controller1.1.4 实现搜索业务 1.2 酒店结果过滤1.2.1 需求分析1.2.2 修

分布式搜索———黑马旅游_new一个对象_的博客-爱代码爱编程

案例功能实现 : ● 酒店搜索和分页 ● 酒店结果过滤 ● 我周边的酒店 ● 酒店竞价排名 资源链接 hoteld-demo工程:https://pan.baidu.com/s/1YlKz6vxcm7VWXAWPlUiB

黑马springboot --开发篇-爱代码爱编程

目录 9.热部署9.1手动启动热部署9.2自动启动热部署9.3热部署范围配置9.4关闭热部署 10.配置高级10.1@ConfigurationProperties✳10.2@EnableConfigurati

centos7中docker安装单节点elasticsearch7.10.1和ik分词器-爱代码爱编程

环境说明:  服务器操作系统: CentOS7.5 Docker版本:19.03.0 1. 拉取镜像 docker pull elasticsearch:7.10.1 2. 创建相关文件夹 #1.以/data目录为例 mkdir -p /data/elasticsearch7-10-1/{data,logs

skywalking+elasticsearch7实现日志追踪-爱代码爱编程

文章目录 1.安装ElasticSearch7下载ElasticSearch71.1 解压 elasticsearch-7.8.01.2 进入elasticsearch-7.8.01.3 ES配置文件1.4 创建es

es-搜索推荐-爱代码爱编程

1. 概述 搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能,即在用户输入搜索的过程中,进行自动补全或者纠错。以此来提高搜索文档的匹配精准度,进而提升用户的搜索体验,这就是Suggest。 ##四种Suggeste

keyword researcher crack-爱代码爱编程

Keyword Researcher Crack  这是唯一一款SEO软件,可以帮助您发现长尾关键词并为您的网站创建SEO优化内容。   你有没有想过如何为你的网站定位长尾关键词?当你在谷歌上输入时,你会看到下拉列表,这是他们预测你下一步输入内容的一种方式。   关键字研究员是一个简单易用的关键字搜索工具。激活后,它通过使用谷歌自动完成并连续在谷歌中

前端性能优化总结-爱代码爱编程

前端性能优化是指在设计和开发网站时,采取一些措施来提升网站的性能。这对用户来说是非常重要的,因为高性能的网站可以带来更好的用户体验,同时也有助于提升搜索引擎排名。 一、常见前端性能优化措施 常见的前端性能优化方法有: 压缩文件:使用 Gzip 压缩可以减小文件大小,提高页面加载速度。 使用浏览器缓存:合理设置缓存策略,例如通过设置缓存头部信息(

微服务入门到入土(07)-爱代码爱编程

教程源自于黑马微服务视频 片段。 喜欢就关注博主吧😀,没有最卷,只有更卷!!! 1. 初始elasticsearch 1.1 简述 什么是elasticsearch? 一个开源的分布式搜索引擎,可以用来实现搜

days04-爱代码爱编程

继上一篇文章的对es的初步了解,接下来对其进行一些实战操作,来加深理解! 资料获取链接:链接:https://pan.baidu.com/s/1DzADAjCiTJtAbeAR1lHjxA                          提取码:epxu 一、 索引库操作         1.1 mapping映射属性 mapping是对索引库中

微服务03 分布式搜索引擎 elasticsearch elk kibana restapi 索引库 dsl查询 restclient 黑马旅游_elk模糊搜索-爱代码爱编程

分布式搜索引擎01 -- elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代

elasticsearch快速入门详解(亲测好用,强烈推荐收藏)-爱代码爱编程

3.快速入门 接下来快速看下elasticsearch的使用 3.1.概念 Elasticsearch虽然是一种NoSql库,但最终的目的是存储数据、检索数据。因此很多概念与MySQL类似的。 ES中的概念数据库概念

分布式搜索引擎02_java 根据输入的查询条件,检索对应的用户列表-爱代码爱编程

文章目录 分布式搜索引擎020.学习目标1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结 1.3.精准查询1.3.1.