elasticsearch13-排序

请添加图片描述
个人名片:

博主:酒徒ᝰ.
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志三人行,必有我师焉。

请添加图片描述
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

目录

  • 四、黑马旅游案例
    • 4. 排序

四、黑马旅游案例

4. 排序

在Elasticsearch中,可以使用sortBy参数对搜索结果进行排序。sortBy参数用于指定排序的字段,以及排序的顺序。

sortBy参数可以接受一个数组,其中每个元素表示一个排序字段。在每个元素中,你可以指定以下参数:

  • 排序字段名(例如date)。
  • 排序顺序。这是可选的,默认是升序(asc)。
  • 排序模式。这是可选的,用于指定排序的方式。例如,min表示按照最小值排序,max表示按照最大值排序。这是可选的,默认值取决于字段的类型。
  • 其他排序参数。例如,对于地理数据类型字段,可以使用geo_distance参数进行地理距离排序。

需要注意的是,Elasticsearch中的排序是影响查询性能的重要因素之一。因此,在执行排序查询时,应该根据具体情况选择合适的排序字段和排序参数,以提高查询的性能和效率。

在页面上,还有一种排序
在这里插入图片描述

测试后,发现与SortBy相关

修改buildBasicQuery

private void buildBasicQuery(RequestParams params, SearchRequest request) {
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    String key = params.getKey();
    if (key == null || "".equals(key)) {
        boolQuery.must(QueryBuilders.matchAllQuery());
    }else {
        boolQuery.must(QueryBuilders.matchQuery("all", key));
    }

    String city = params.getCity();
    if (city != null && !"".equals(city)){
        boolQuery.filter(QueryBuilders.termQuery("city", city));
    }
    String brand = params.getBrand();
    if (brand != null && !"".equals(brand)){
        boolQuery.filter(QueryBuilders.termQuery("brand", brand));
    }
    String starName = params.getStarName();
    if (starName != null && !"".equals(starName)){
        boolQuery.filter(QueryBuilders.termQuery("starName", starName));
    }
    Integer maxPrice = params.getMaxPrice();
    Integer minPrice = params.getMinPrice();
    if (maxPrice != null && minPrice != null) {
        boolQuery.filter(QueryBuilders.rangeQuery("price")
                .gte(minPrice)
                .lte(maxPrice));
    }
    String location = params.getLocation();
    if (location != null && !"".equals(location)){
        request.source().sort(SortBuilders
                .geoDistanceSort("location", new GeoPoint(location))
                .order(SortOrder.ASC)
                .unit(DistanceUnit.KILOMETERS)
        );
    }
    String sortBy = params.getSortBy();
    if (sortBy.equals("score")){
        request.source().sort(sortBy, SortOrder.DESC);
    }else if (sortBy.equals("price")){
        request.source().sort(sortBy, SortOrder.ASC);
    }

    FunctionScoreQueryBuilder functionScoreQuery =
            QueryBuilders.functionScoreQuery(
            boolQuery,
            new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                            QueryBuilders.termQuery("isAD", true),
                            ScoreFunctionBuilders.weightFactorFunction(10)
                    )
            }
    );
    request.source().query(functionScoreQuery);

    int page = params.getPage(), size = params.getSize();
    request.source().
            from((page-1)*page).size(size);
}

总结:

  1. 优势:
    自动维护数据的分布到多个节点的索引的建立,还有搜索请求分布到多个节点的执行;自动维护数据的冗余副本,保证说,一些机器宕机了,不会丢失任何的数据;封装了更多的高级功能,以给我们提供更多高级的支持,让我们快速的开发应用,开发更加复杂的应用:复杂的搜索功能,聚合分析的功能,比如基于地理位置的搜索等。
  2. 作用:
    SortBy是Elasticsearch中的排序参数,用于对搜索结果进行排序。它允许你根据指定的字段对搜索结果进行排序,可以接受一个数组,其中每个元素表示一个排序字段。
    SortBy还支持多字段排序。你可以按照多个字段对搜索结果进行排序,每个字段都可以设置不同的排序顺序和模式。这使得你可以根据多个因素来排序搜索结果,例如先按照时间排序,再按照价格排序等。
    SortBy可以与其他查询参数一起使用,例如Query和Filter。你可以在Query或Filter查询中使用SortBy参数来对搜索结果进行排序。这使得你可以在查询数据的同时对结果进行排序,从而获得更准确的结果。

你可能感兴趣的:(#,elasticsearch,elasticsearch,搜索引擎)