【ElasticSearch】ES案例:旅游酒店搜索

这篇具有很好参考价值的文章主要介绍了【ElasticSearch】ES案例:旅游酒店搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、项目分析

启动hotel-demo项目,访问localhost:servicePort,即可访问static下的index.html:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

从页面分析,我们需要实现搜索、分页、排序等功能。点击页面,可以看到list接口的传参为:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

二、需求1:酒店搜索功能

接下来实现酒店搜索功能,完成关键字搜索和分页。

  • 定义接参的Dto类
@Data
public class RequestParam {

    private String key;

    private Integer page;  //pageNum

    private Integer size;  //pageSize

    private String sortBy;
}


  • 定义返回的结果类
@AllArgsConstructor
@NoArgsConstructor
@Data
public class PageResult {

    private Long total;

    private List<HotelDoc>  hotelDocList;
}
  • 定义controller接口,接收页面请求
@RestController
@RequestMapping("/hotel")
public class HotelSearchController {

    @Resource
    IHotelService hotelService;

    @PostMapping("/list")
    public PageResult searchHotel(@RequestBody RequestParam requestParam){
        return hotelService.search(requestParam);
    }

}
  • Service层要用到JavaRestHighLevelClient对象,在启动类中定义这个Bean
@SpringBootApplication
public class HotelDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(HotelDemoApplication.class, args);
    }

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

}
  • 完成Service层,利用match查询实现根据关键字搜索酒店信息
public interface IHotelService extends IService<Hotel> {
    PageResult search(RequestParam requestParam);
}
@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {

    @Resource
    RestHighLevelClient client;  //注入客户端操作的bean

    @Override
    public PageResult search(RequestParam requestParam) {
        try {
            SearchRequest request = new SearchRequest("hotel");
            //搜索关键字
            String key = requestParam.getKey();
            if (StringUtils.isNotEmpty(key)) {   //有key就走全文检索
                request.source().query(QueryBuilders.matchQuery("all", key));
            } else {   //没key就走查所有
                request.source().query(QueryBuilders.matchAllQuery());
            }
            //分页
            request.source().from((requestParam.getPage() - 1) * requestParam.getSize())    //(pageNum-1)*pageSize
                    .size(requestParam.getSize());
                    //发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            //处理响应结果
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException();
        }

    }
	
	//处理响应结果的方法
    private PageResult handleResponse(SearchResponse response) {
        SearchHits searchHits = response.getHits();
        long total = searchHits.getTotalHits().value;
        SearchHit[] hits = searchHits.getHits();
        //Stream流将hits中的每条数据都转为HotelDoc对象
        List<HotelDoc> hotelDocList = Arrays.stream(hits).map(t -> {
            String json = t.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            return hotelDoc;
        }).collect(Collectors.toList());
        return new PageResult(total, hotelDocList);
    }
}

重启服务,搜索和分页已实现。

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

三、需求2:添加过滤功能

接下来添加品牌、城市、星级、价格的过滤功能。这里参与搜索的条件对应着不同的搜索类型,有全文检索,有精确查找,自然要用复合查询Boolean Search

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

  • 修改接参dto类:
@Data
public class RequestParam {

    private String key;

    private Integer page;  //pageNum

    private Integer size;  //pageSize

    private String sortBy;

	private String brand;  
	  
	private String starName; 
	   
	private String city;    
	
	private Integer minPrice;    
	
	private Integer maxPrice;

}
  • 修改Service层实现,这里把搜索条件的构建单独抽取成方法,一来方便后面复用,二来让代码看着清爽点
@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {

    @Resource
    RestHighLevelClient client;

    @Override
    public PageResult search(RequestParam requestParam) {
        try {
            //准备request
            SearchRequest request = new SearchRequest("hotel");
            //构建查询条件
            buildBasicQuery(requestParam, request);
            //分页
            request.source().from((requestParam.getPage() - 1) * requestParam.getSize())
                    .size(requestParam.getSize());
            //发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            //处理响应结果
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException();
        }

    }

    private void buildBasicQuery(RequestParam requestParam, SearchRequest request) {
        BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
        //关键字
        String key = requestParam.getKey();
        if (! isEmpty(key)) {
            booleanQuery.must(QueryBuilders.matchQuery("all", key));
        } else {
            booleanQuery.must(QueryBuilders.matchAllQuery());
        }
        //城市
        if (! isEmpty(requestParam.getCity())) {
            booleanQuery.filter(QueryBuilders.termQuery("city", requestParam.getCity()));
        }
        //品牌
        if (! isEmpty(requestParam.getBrand())) {
            booleanQuery.filter(QueryBuilders.termQuery("brand", requestParam.getBrand()));
        }
        //星级
        if (! isEmpty(requestParam.getStarName())) {
            booleanQuery.filter(QueryBuilders.termQuery("startName", requestParam.getStarName()));
        }
        //价格
        if (requestParam.getMaxPrice() != null && requestParam.getMinPrice() != null) {
            booleanQuery.filter(QueryBuilders.rangeQuery("price")
                    .lte(requestParam.getMaxPrice())
                    .gte(requestParam.getMinPrice()));
        }
        request.source().query(booleanQuery);


    }

    private static boolean isEmpty(String str){
        return str == null || "".equals(str);
    }
}

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

四、需求3:我附近的酒店

前端页面点击定位后,会将你所在的位置发送到后台:
【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据
接下来实现根据这个坐标,将酒店结果按照到这个点的距离升序排序。
【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

距离排序与普通字段排序有所差异,对比如下:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

开始实现需求:

  • 修改RequestParams参数,接收location字段
@Data
public class RequestParam {

    private String key;

    private Integer page;  //pageNum

    private Integer size;  //pageSize

    private String sortBy;

	private String brand;  
	  
	private String starName; 
	   
	private String city;    
	
	private Integer minPrice;    
	
	private Integer maxPrice;

	private String location;  //经纬度位置
}
  • 修改Service中,在分页前加排序逻辑
@Override
public PageResult search(RequestParam requestParam) {
    try {
        //准备request
        SearchRequest request = new SearchRequest("hotel");
        //构建查询条件
        buildBasicQuery(requestParam, request);
        //排序
        String myLocation = requestParam.getLocation();
        if(! isEmpty(myLocation)){
            request.source().sort(SortBuilders
                    .geoDistanceSort("location",new GeoPoint(myLocation))
                    .order(SortOrder.ASC)
                    .unit(DistanceUnit.KILOMETERS));
        }
        //分页
        request.source().from((requestParam.getPage() - 1) * requestParam.getSize())
                .size(requestParam.getSize());
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //处理响应结果
        return handleResponse(response);
    } catch (IOException e) {
        throw new RuntimeException();
    }

}

但此时发现返回结果中少了距离你xxx千米的信息:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

查看DSL返回结果,看到距离是在sort字段中:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

因此需要修改结果处理的方法,且最后pageResult中是HotelDoc对象的集合,因此,修改Hoteldoc类,加distance距离字段:

@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();
    }
}
private PageResult handleResponse(SearchResponse response) {
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    SearchHit[] hits = searchHits.getHits();
    List<HotelDoc> hotelDocList = Arrays.stream(hits).map(t -> {
        String json = t.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        //开始加入距离
        Object[] sortValues = t.getSortValues();   //排序字段可能不止一个
        if(sortValues.length > 0 ){
            Object sortValue = sortValues[0];
            hotelDoc.setDistance(sortValue); 拿到sort值赋值给距离
        }
        return hotelDoc;
    }).collect(Collectors.toList());
    return new PageResult(total, hotelDocList);
}

到此,需求实现:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

五、需求4:置顶花广告费的酒店

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

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据
实现思路为:

  • HotelDoc类添加标记字段isAD,Boolean类型
  • 对于出广告费的酒店,isAD为true,前端可用这个字段给酒店打广告标签
  • 使用function score给花钱的酒店人为增加权重,干涉排序

代码实现:

  • hotelDoc类:
@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;   //新加字段
	//是否有广告费
	private Boolean isAD;
  • 更新ES数据,模拟某酒店出广告费

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

  • 加入function score算分认为控制,给isAD为true的加权
private void buildBasicQuery(RequestParam requestParam, SearchRequest request) {
    //BoolQuery原始查询条件,原始算分
    BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
    //关键字
    String key = requestParam.getKey();
    if (!isEmpty(key)) {
        booleanQuery.must(QueryBuilders.matchQuery("all", key));
    } else {
        booleanQuery.must(QueryBuilders.matchAllQuery());
    }
    //城市
    if (!isEmpty(requestParam.getCity())) {
        booleanQuery.filter(QueryBuilders.termQuery("city", requestParam.getCity()));
    }
    //品牌
    if (!isEmpty(requestParam.getBrand())) {
        booleanQuery.filter(QueryBuilders.termQuery("brand", requestParam.getBrand()));
    }
    //星级
    if (!isEmpty(requestParam.getStarName())) {
        booleanQuery.filter(QueryBuilders.termQuery("startName", requestParam.getStarName()));
    }
    //价格
    if (requestParam.getMaxPrice() != null && requestParam.getMinPrice() != null) {
        booleanQuery.filter(QueryBuilders.rangeQuery("price")
                .lte(requestParam.getMaxPrice())
                .gte(requestParam.getMinPrice()));
    }
    
    //function score算分控制
    FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
            booleanQuery,  //第一个参数传入booleanQuery为原始查询,对应原始的相关性算分
            new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{  //第二个形参,function score数组,里面有个function score元素
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(  //function score元素对象,第一个参数传入筛选字段
                            QueryBuilders.termQuery("isAD", true),   //不再用酒店品牌筛选,而是isAD字段
                            ScoreFunctionBuilders.weightFactorFunction(10)  //算分函数,用默认的乘法,权重为10
                    )
            });
    request.source().query(functionScoreQuery);


}

实现效果;

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据


Function Score查询可以控制文档的相关性算分,使用方式如下:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据

最后贴上以上四个需求Service层代码:

import cn.itcast.hotel.domain.dto.RequestParam;
import cn.itcast.hotel.domain.pojo.HotelDoc;
import cn.itcast.hotel.domain.vo.PageResult;
import cn.itcast.hotel.mapper.HotelMapper;
import cn.itcast.hotel.domain.pojo.Hotel;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;


import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {

    @Resource
    RestHighLevelClient client;

    @Override
    public PageResult search(RequestParam requestParam) {
        try {
            //准备request
            SearchRequest request = new SearchRequest("hotel");
            //构建查询条件
            buildBasicQuery(requestParam, request);
            //排序
            String myLocation = requestParam.getLocation();
            if (!isEmpty(myLocation)) {
                request.source().sort(SortBuilders
                        .geoDistanceSort("location", new GeoPoint(myLocation))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }
            //分页
            request.source().from((requestParam.getPage() - 1) * requestParam.getSize())
                    .size(requestParam.getSize());
            //发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            //处理响应结果
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException();
        }

    }

    private void buildBasicQuery(RequestParam requestParam, SearchRequest request) {
        //BoolQuery原始查询条件,原始算分
        BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
        //关键字
        String key = requestParam.getKey();
        if (!isEmpty(key)) {
            booleanQuery.must(QueryBuilders.matchQuery("all", key));
        } else {
            booleanQuery.must(QueryBuilders.matchAllQuery());
        }
        //城市
        if (!isEmpty(requestParam.getCity())) {
            booleanQuery.filter(QueryBuilders.termQuery("city", requestParam.getCity()));
        }
        //品牌
        if (!isEmpty(requestParam.getBrand())) {
            booleanQuery.filter(QueryBuilders.termQuery("brand", requestParam.getBrand()));
        }
        //星级
        if (!isEmpty(requestParam.getStarName())) {
            booleanQuery.filter(QueryBuilders.termQuery("startName", requestParam.getStarName()));
        }
        //价格
        if (requestParam.getMaxPrice() != null && requestParam.getMinPrice() != null) {
            booleanQuery.filter(QueryBuilders.rangeQuery("price")
                    .lte(requestParam.getMaxPrice())
                    .gte(requestParam.getMinPrice()));
        }

        //function score算分控制
        FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
                booleanQuery,  //第一个参数传入booleanQuery为原始查询,对应原始的相关性算分
                new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{  //第二个形参,function score数组,里面有个function score元素
                        new FunctionScoreQueryBuilder.FilterFunctionBuilder(  //function score元素对象,第一个参数传入筛选字段
                                QueryBuilders.termQuery("isAD", true),   //不再用酒店品牌筛选,而是isAD字段
                                ScoreFunctionBuilders.weightFactorFunction(10)  //算分函数,用默认的乘法,权重为10
                        )
                });
        request.source().query(functionScoreQuery);


    }

    private PageResult handleResponse(SearchResponse response) {
        SearchHits searchHits = response.getHits();
        long total = searchHits.getTotalHits().value;
        SearchHit[] hits = searchHits.getHits();
        List<HotelDoc> hotelDocList = Arrays.stream(hits).map(t -> {
            String json = t.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //开始加入距离
            Object[] sortValues = t.getSortValues();
            if (sortValues.length > 0) {
                Object sortValue = sortValues[0];
                hotelDoc.setDistance(sortValue);
            }
            return hotelDoc;
        }).collect(Collectors.toList());
        return new PageResult(total, hotelDocList);
    }

    private static boolean isEmpty(String str) {
        return str == null || "".equals(str);
    }
}

最后,页面上其他地方的需求实现思路:

排序:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据
前端会传递sortBy参数,就是排序方式,后端需要判断sortBy值是什么:

  • default:相关度算分排序,这个不用管,es的默认排序策略
  • score:根据酒店的score字段排序,也就是用户评价,降序
  • price:根据酒店的price字段排序,就是价格,升序
高亮:

【ElasticSearch】ES案例:旅游酒店搜索,ElasticSearch,SpringCloud,elasticsearch,旅游,大数据文章来源地址https://www.toymoban.com/news/detail-625478.html

request.source()
        .query(QueryBuilders.matchQuery("all",requestParam.getKey()))
        .highlighter(new HighlightBuilder().field("name")
                .requireFieldMatch(false)
                .preTags("<strong>")
                .postTags("</strong")
        );

到了这里,关于【ElasticSearch】ES案例:旅游酒店搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch(ES)分布式搜索引擎03——(RestClient查询文档,ES旅游案例实战)

    文档的查询同样适用昨天学习的 RestHighLevelClient对象,基本步骤包括: 1)准备Request对象 2)准备请求参数 3)发起请求 4)解析响应 我们以match_all查询为例 3.1.1.发起查询请求 代码解读: 第一步,创建 SearchRequest 对象,指定索引库名 第二步,利用 request.source() 构建DSL,DSL中可

    2024年02月07日
    浏览(41)
  • 黑马旅游案例(包括搜索,分页,广告置顶)中使用 elasticsearch 7.17.9 Java API

    引言 学习黑马 SpringCloud 的 es 部分时发现老师用的是es的高级客户端来操作es的,而高级客户端已经显示弃用,上网搜索发现关于新的 Java client API 只有基础的索引、文档操作,没有关于这种稍复杂案例的操作,于是自己琢磨整理了一份笔记,也为其他学习最新的 es 的小伙伴

    2024年02月11日
    浏览(34)
  • ES实战 | 黑马旅游案例

    需求:根据文字搜索,也可以选择标签搜索 思路:用bool查询,先根据查询全部,再根据标签过滤。 需求:实现分页排序 思路:分页跟排序是单独的功能,可以根据选项排好序再分页 要求:点击获取位置后,根据距离显示酒店,且要显示距离 思路:先判断有没有点击

    2023年04月09日
    浏览(47)
  • 【黑马旅游案例记录(结合ES)】

    下面,我们通过黑马旅游的案例来实战演练下之前学习的知识。 我们实现四部分功能: 酒店搜索和分页 酒店结果过滤 我周边的酒店 酒店竞价排名 启动我们提供的hotel-demo项目,其默认端口是8089,访问http://localhost:8089,就能看到项目页面了: 11.9.1.酒店搜索和分页 案例需求

    2024年02月05日
    浏览(24)
  • 【Elasticsearch】黑马旅游案例

    目录 4.黑马旅游案例 4.1.酒店搜索和分页 4.1.1.需求分析 4.1.2.定义实体类 4.1.3.定义controller 4.1.4.实现搜索业务 4.2.酒店结果过滤 4.2.1.需求分析 4.2.2.修改实体类 4.2.3.修改搜索业务 4.3.我周边的酒店 4.3.1.需求分析 4.3.2.修改实体类 4.3.3.距离排序API 4.3.4.添加距离排序 4.3.5.排序距离显

    2024年02月16日
    浏览(29)
  • SpringCloud:初识ES(ElasticSearch)

    1.1.1. ElasticSearch 的作用 ElasticSearch 是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在 GitHub 搜索代码 在百度搜索答案 1.1.2. ELK 技术栈 ElasticSearch 结合 kibana 、 Logstash 、 Beats ,也就是 elastic stack ( ELK )。被广泛

    2023年04月15日
    浏览(23)
  • 【Springcloud】分布式搜索elasticsearch

    先看下翻译: elasticsearch是一款非常强大的 开源搜索引擎 ,可以帮助我们 从海量数据中快速找到需要的内容 以下是生活中ES的使用场景: 项目在运行的时候会产生海量的日志信息,而elasticsearch结合kibana、Logstash、Beats,也就是elastic stack( ELK ),即ELK技术栈。被广泛应用在

    2024年02月08日
    浏览(32)
  • SpringCloud实用篇6——elasticsearch搜索功能

    elasticsearch的查询依然是基于JSON风格的DSL来实现的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有 :查询出所有数据,一般测试用。例如: match_all 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去倒排索

    2024年02月12日
    浏览(25)
  • ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入

    导航: 【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 黑马旅游源码:  https://wwmg.lanzouk.com/ikjTE135ybje 目录 1.初识弹性搜索elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK弹性栈 1.1.3.elasticsearch和lucene 1.1.4.搜索引擎技术

    2024年02月01日
    浏览(42)
  • SpringCloud分布式搜索引擎、数据聚合、ES和MQ的结合使用、ES集群的问题

    目录 数据聚合 聚合的分类 ​编辑 DSL实现Bucket聚合 ​编辑  DSL实现Metrics聚合​编辑 RestAPI实现聚合  对接前端接口​编辑  自定义分词器​编辑 Completion suggester查询 Completion suggester查询 酒店数据自动补全 实现酒店搜索框界面输入框的自动补全  数据同步问题分析​编辑 同

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包