es——java实现基本搜索功能

这篇具有很好参考价值的文章主要介绍了es——java实现基本搜索功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在输入框输入搜索关键字、点击页面过滤项、翻页、排序都会导致请求发出,查询商品信息:

es——java实现基本搜索功能 

需要实现的功能包括:

  • 关键字搜索

  • 分类、品牌、价格过滤

  • 排序

  • 分页

  • 高亮

  • 竞价排名

接口说明:

es——java实现基本搜索功能

 controller层:

/**
     * 关键字搜索,分页
     */
    @PostMapping("/list")
    public PageDTO<ItemDoc> list(@RequestBody RequestParams params){
        log.info("关键字搜索,分页===前后端联通==" + params);
        this.isearchService.list(params);
        return this.isearchService.list(params);
    }

service层:

/**
     * 搜索关键字,分页
     */
    PageDTO<ItemDoc> list(RequestParams params);

service实现类:文章来源地址https://www.toymoban.com/news/detail-504517.html

 @Autowired
    private RestHighLevelClient client;

    /**
     * 搜索关键字,分页
     */
    @Override
    public PageDTO<ItemDoc> list(RequestParams params) {
        try {
            //准备Request
            SearchRequest request = new SearchRequest("item");
            //设置请求参数
            buildBasicQuery(params, request);
            //排序 sort
            if (!StringUtils.isBlank(params.getSortBy())) {
                if ("sold".equals(params.getSortBy())) {//按评价排序
                    request.source().sort(params.getSortBy(), SortOrder.DESC);
                }
                if ("price".equals(params.getSortBy())) {//按价格排序
                    request.source().sort(params.getSortBy(), SortOrder.ASC);
                }
            }
            //分页
            request.source().from(params.getPage() - 1).size(params.getSize());
            //高亮
            request.source().highlighter(
                    new HighlightBuilder().field("name").requireFieldMatch(false)
            );
            //执行请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            //解析结果
            PageDTO<ItemDoc> pageDTO = this.processResponse(response);
            return pageDTO;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 解析响应结果
     *
     * @param response
     */
    private PageDTO<ItemDoc> processResponse(SearchResponse response) {
        PageDTO<ItemDoc> pageDTO = new PageDTO<>();
        //酒店数据集合
        List<ItemDoc> list = new ArrayList<ItemDoc>();
        //解析结果
        SearchHits searchHits = response.getHits();
        //获取文档总数量
        TotalHits total = searchHits.getTotalHits();
        pageDTO.setTotal(total.value);
        //获取文档详情
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : searchHits) {
            //文档内容
            String json = hit.getSourceAsString();
            //将json格式转为对象
            ItemDoc itemDoc = JSONObject.parseObject(json, ItemDoc.class);
            //高亮
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (!CollectionUtils.isEmpty(highlightFields)) {
                HighlightField highlightField = highlightFields.get("name");
                //高亮处理后的名称
                String highLightName = highlightField.getFragments()[0].string();
                //覆盖之前的名称
                itemDoc.setName(highLightName);
            }
            //将对先加入集合
            list.add(itemDoc);
        }
        pageDTO.setList(list);
        return pageDTO;
    }

/**
     * 查询条件
     *
     * @param params
     * @param request
     */
    private void buildBasicQuery(RequestParams params, SearchRequest request) {
        // 1.构建BooleanQuery
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        // 2.关键字搜索
        if (!StringUtils.isBlank(params.getKey())) {
            boolQuery.must(QueryBuilders.matchQuery("all", params.getKey()));
        } else {
            boolQuery.must(QueryBuilders.matchAllQuery());
        }
        //过滤
        //品牌
        if (!StringUtils.isBlank(params.getBrand())) {
            boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
        }
        //分类
        if (!StringUtils.isBlank(params.getCategory())) {
            boolQuery.filter(QueryBuilders.termQuery("category", params.getCategory()));
        }
        //价格
        if (params.getMinPrice() != null && params.getMaxPrice() != null) {
            boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
        }

        //复合查询——算分函数查询
        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
                boolQuery, //原始查询
                new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                        new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                QueryBuilders.termQuery("isAD", true), //过滤条件(符合条件的文档,重新打分)
                                ScoreFunctionBuilders.weightFactorFunction(10) //如何打分
                        )
                }
        ).boostMode(CombineFunction.SUM);//加权规则(新旧得分运算规则)
        //设置整体查询
        request.source().query(functionScoreQueryBuilder);
    }

到了这里,关于es——java实现基本搜索功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Vue 高德地图(@amap/amap-jsapi-loader)的基本使用:添加标记、POI关键字搜索、路线规划...(方法一)

    具体的步骤可以参考我的上一篇博客,有详细说明如何注册申请高德的Key、秘钥,初始化地图等等 vue-amap : vue-amap 基于 Vue 2.x 与高德的地图组件 高德官方介绍:地图 JS API Web服务API简介 高德Web服务API向开发者提供HTTP接口,开发者可通过这些接口使用各类型的地理数据服务,

    2024年01月18日
    浏览(51)
  • 苏宁API接口解析,实现按关键字搜索suning商品

    苏宁API接口提供了多种搜索商品的方式,其中包括按搜索。下面是一个简单的示例,演示如何使用苏宁API接口实现按搜索商品: 请求参数 请求参数:q=鞋子start_price=end_price=page=cat=discount_only=sort=page_size=seller_info=nick=ppath= 参数说明:q:搜索 cat:分类ID start_p

    2024年02月09日
    浏览(50)
  • Java基础篇_1.2——保留关键字、基本数据类型、基本数据类型之间的转换

    目录 一、保留 二、Java的基本数据类型 三、引用数据类型  四、基本数据类型间的转换  隐含强制类型转换 数值之间的合法转换 Java该语言是用 Unicode 字符集编写的。 Java是预先定义的具有特别意义的标识符,也被称为Java保留字,Java不能用作变量名、方

    2024年02月14日
    浏览(54)
  • Java中的volatile关键字实现原理

    在并发编程中,线程之间的可见性问题是非常重要的一项难题。Java中提供了一种解决并发可见性问题的机制,即volatile。 在本文中,我们将会讲解Java中volatile的实现原理,为什么它能够保证可见性,以及背后的实现原理涉及到的内存屏障和JVM屏障等内容。在学习

    2023年04月27日
    浏览(43)
  • 搜索引擎优化指南:SEO关键字、长尾关键字、短尾关键字以及反向链接

    SEO 代表“搜索引擎优化”。它是一种数字营销策略,旨在提高网站或网页在搜索引擎未付费结果中的在线可见性。通常,网站在搜索结果页面中排名越高,或在搜索结果列表中显示的频率越高,它将从搜索引擎用户那里获得的访问者就越多。 SEO 策略可以针对各种类型的搜索

    2024年02月04日
    浏览(148)
  • 拼多多关键字搜索API-通过关键字获取拼多多商品列表

    pinduoduo.item_search 公共参数 请求地址: pinduoduo/item_search 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等] cache String 否 [yes,no]默认yes,将调用缓存的数据

    2024年02月22日
    浏览(83)
  • elasticsearch搜索关键字高亮显示

    使用 elasticsearch 时,有一个很常见的需求是,能在页面上将搜索出的结果中属于的文字,进行高亮显示。 elasticsearch 对这个做了一定的支持,它能查询结果的基础上,额外返回需要高亮显示的整个文本,至于具体你想怎么用它,需要根据业务自行实现。 使用 k

    2023年04月08日
    浏览(52)
  • ElasticSearch nested 字段多关键字搜索,高亮全部匹配关键字的处理

    ElasticSearch 版本号: 6.7.0 用户会传入多个去ES查询 ElasticSearch nested 字段 的多个字段,要求在返回的结果中被搜索的字段需要高亮所有匹配的。例如同时通过 上海 和 策划 ,再 工作经历 的列表中的 工作内容 和 公司名称 中搜索。如果有人员的 工作经历 中

    2024年04月22日
    浏览(59)
  • 【C++】关键字 & 命名空间 & 输入输出 & 缺省函数

    C++  总计 63 个, C语言 32 个 直接上图:  asm do if return try continue auto double inline short typedef for bool dynamic_cast int signed typeid public break else long sizeof typename throw case enum mutable static union wchar_t catch explicit namespace static_cast unsigned default char export new struct using friend class ext

    2024年02月08日
    浏览(49)
  • js将搜索的关键字加颜色

    使用正则匹配并加入span标签,页面渲染时使用v-html渲染即可

    2024年02月11日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包