elasticsearch13-排序


个人名片:

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

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

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

目录

四、黑马旅游案例

4. 排序

在Elasticsearch中,可以使用sortBy参数对搜索结果进行排序。sortBy参数用于指定排序的字段,以及排序的顺序。
sortBy参数可以接受一个数组,其中每个元素表示一个排序字段。在每个元素中,你可以指定以下参数:

  • 排序字段名(例如date)。
  • 排序顺序。这是可选的,默认是升序(asc)。
  • 排序模式。这是可选的,用于指定排序的方式。例如,min表示按照最小值排序,max表示按照最大值排序。这是可选的,默认值取决于字段的类型。
  • 其他排序参数。例如,对于地理数据类型字段,可以使用geo_distance参数进行地理距离排序。
    需要注意的是,Elasticsearch中的排序是影响查询性能的重要因素之一。因此,在执行排序查询时,应该根据具体情况选择合适的排序字段和排序参数,以提高查询的性能和效率。

在页面上,还有一种排序

测试后,发现与SortBy相关

修改buildBasicQuery

java 复制代码
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参数来对搜索结果进行排序。这使得你可以在查询数据的同时对结果进行排序,从而获得更准确的结果。
相关推荐
Familyism4 小时前
ES基础入门
大数据·elasticsearch·搜索引擎
跟着珅聪学java7 小时前
git stash详细教程
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客8 小时前
使用 Elasticsearch Agent Builder 构建对话式费用助手,结合 Telegram, n8n 和 AWS Bedrock
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·aws
MARSERERER8 小时前
ElasticSearch如何使用bulk load
大数据·elasticsearch
WizLC8 小时前
【后端】关于Elasticsearch的入门,下载安装+使用
java·大数据·后端·elasticsearch·搜索引擎·全文检索
启明真纳8 小时前
Elasticsearch分词
大数据·elasticsearch
老陈头聊SEO19 小时前
生成引擎优化(GEO)助力内容创作与用户体验协同提升的新方法
其他·搜索引擎·seo优化
Elastic 中国社区官方博客20 小时前
让我们把这个 expense 工具从 n8n 迁移到 Elastic One Workflow
大数据·运维·elasticsearch·搜索引擎·ai·信息可视化·全文检索
Elasticsearch1 天前
通过将 OpenTelemetry Collector 用作框架,释放其强大功能
elasticsearch
risc1234561 天前
【Elasticsearch】如何读源码
elasticsearch