• 拼装搜索请求参数(SearchRequest)

    • 创建参数存储对象(SearchSourceBuilder)

      • 拼装搜索条件(QueryBuilders)

        • match_all : 查询全部

        • match

        • term

        • range

        • geodistance

        • bool

        MatchAllQueryBuilder query = QueryBuilders.matchAllQuery();
        sourceBuilder.query(query);// 把搜索条件存入参数对象中
        ​
        // 拼装搜索条件-模糊全部
        // 参数1:搜索的字段名称
        // 参数2:搜索的关键字
        MatchQueryBuilder query = QueryBuilders.matchQuery("name", "上海外滩");
        sourceBuilder.query(query);// 把搜索条件存入参数对象中
        ​
        // 参数2:搜索的字段名称
        // 参数1:搜索的关键字
        MultiMatchQueryBuilder query = QueryBuilders.multiMatchQuery("福华路广场","name","address");
        ​
        // 参数1:搜索的字段名称
        // 参数2:搜索的关键字
        TermQueryBuilder query = QueryBuilders.termQuery("brand", "7天酒店");
        ​
        RangeQueryBuilder query = QueryBuilders.rangeQuery("price").gte(10).lte(159);
        ​
        // bool查询
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        ​
        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "如家");
        query.must(matchQuery);
        ​
        RangeQueryBuilder priceQuery = QueryBuilders.rangeQuery("price").gte(400);
        query.mustNot(priceQuery);
        ​
        GeoDistanceQueryBuilder locationQuery = QueryBuilders.geoDistanceQuery("location").distance(10, DistanceUnit.KILOMETERS).point(31.21, 121.5);
        query.filter(locationQuery);
        • function_score

        // ========================= 拼装广告置顶的搜索条件
        FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[1];
        ​
        TermQueryBuilder adQuery = QueryBuilders.termQuery("isAD", true);
        WeightBuilder weightBuilder = ScoreFunctionBuilders.weightFactorFunction(10);
        ​

      // 参数1:过滤条件 adQuery // 参数2:分值策略

    • weightBuilder filterFunctionBuilders[0] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(adQuery,weightBuilder);

      // 参数1:查询条件 query // 参数2:分值修改函数

    • FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(query,filterFunctionBuilders); functionScoreQuery.boostMode(CombineFunction.MULTIPLY);

      sourceBuilder.query(functionScoreQuery);

      - 拼装分页条件// 分页参数int page = 2;int size = 10;sourceBuilder.size(size);sourceBuilder.from((page-1)*size);

      // 分页参数\ int page = 2; int size = 10; sourceBuilder.size(size); sourceBuilder.from((page-1)*size);

      - 拼装排序条件```javasourceBuilder.sort("price", SortOrder.DESC);sourceBuilder.sort("score", SortOrder.DESC);
      
      • 拼装高亮条件

        // 高亮条件
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("name");
        highlightBuilder.preTags("<b>");
        highlightBuilder.postTags("</b>");
        highlightBuilder.requireFieldMatch(false);//搜索字段和高亮字段不进行一致性检查
        sourceBuilder.highlighter(highlightBuilder);
        
      • 拼装聚合条件(AggregationBuilders)

        // 设置城市聚合条件
        TermsAggregationBuilder city = AggregationBuilders.terms("city_name").field("city").size(10);
        sourceBuilder.aggregation(city);
        // 设置星级聚合条件
        TermsAggregationBuilder starName = AggregationBuilders.terms("star_name").field("starName").size(20);
        sourceBuilder.aggregation(starName);
        // 设置品牌聚合条件
        TermsAggregationBuilder brand = AggregationBuilders.terms("brand_name").field("brand").size(20);
        sourceBuilder.aggregation(brand);
        ​
        request.source(sourceBuilder);
        
  • 执行请求

    // 执行搜索请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
  • 解析搜索结果

    • 解析总条数

      // 获取查询总条数
      TotalHits totalHits = hits.getTotalHits();
      long total = totalHits.value;
      System.out.println("总条数:"+total);
    • 解析分页数据

      // 获取当前页数据
      SearchHit[] list = hits.getHits();
      List<HotelDoc> results = new ArrayList<>();
      for (SearchHit hit : list) {String doc = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(doc, HotelDoc.class);results.add(hotelDoc);
      }
      System.out.println(results.toString());
    • 解析排序数据

      // 获取排序结果
      Object[] sortValues = hit.getSortValues();
      if(sortValues!=null&&sortValues.length>0){doc.setDistance(sortValues[0]);
      }
    • 解析高亮数据

      // 解析高亮结果
      Map<String, HighlightField> highlightFields = hit.getHighlightFields();
      if(highlightFields!=null) {HighlightField highlightField = highlightFields.get("name");if(highlightField!=null) {Text[] fragments = highlightField.fragments();Text fragment = fragments[0];String temp = fragment.string();hotelDoc.setName(temp);}
      }
    • 解析聚合数据

      Terms terms = (Terms) aggregationMap.get(name);
      List<? extends Terms.Bucket> buckets = terms.getBuckets();
      List<String> list = new ArrayList<>();
      for (Terms.Bucket bucket : buckets) {String key = bucket.getKeyAsString();list.add(key);
      }

Elasticsearch常见搜索方法的实现相关推荐

  1. 基于Elasticsearch实现搜索推荐

    在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此基于上进一步优化搜索体验,在当搜索无结果或结果过少时提供推荐搜索词给用户. ...

  2. ElasticSearch学习29_基于Elasticsearch实现搜索推荐

    2019独角兽企业重金招聘Python工程师标准>>> 在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议,而本文是在此 ...

  3. 基于Java、Kafka、ElasticSearch的搜索框架的设计与实现

    Jkes是一个基于Java.Kafka.ElasticSearch的搜索框架.Jkes提供了注解驱动的JPA风格的对象/文档映射,使用rest api用于文档搜索. 项目主页:https://gith ...

  4. 一文介绍备机重建各种方法的实现机制

    摘要:本文将介绍备机重建各种方法的实现机制,并结合应用场景分析,以及对新增参数的使用建议,以期获得最佳应用效果. 本文分享自华为云社区<先码再看,一文介绍备机重建各种方法的实现机制>,原文 ...

  5. ElasticSearch(七) 搜索

    title: ElasticSearch(七) 搜索 tags: ElasticSearch author: Clown95 搜索 在前面,已经介绍了在ElasticSearch索引中处理数据的基础知 ...

  6. elasticsearch分布式搜索配置文件详解

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务.它是基于Apache Lucene搜索引擎的类库创 ...

  7. DataList中的按钮触发事件的方法的实现

    DataList中的按钮触发事件的方法的实现 1.要在CommandName中设定名字如:       <asp:Button id="Button1" runat=&quo ...

  8. python运行mcmc为何老出错_python中mcmc方法的实现

    MCMC方法在贝叶斯统计中运用很多,MIT发布的EMCEE是实现的比较好的.介绍页面在下面.源代码中examples里的代码可以帮助理解各种功能,特别是line.py 列出了最小二乘法,最大似然法和M ...

  9. Java黑皮书课后题第10章:**10.23(实现String类)在Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString2)

    **10.23(实现String类)在Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString2) 题目 简短的吐槽 代码:这里将类名改用Test23_MyStrin ...

最新文章

  1. java override overwrite,重写(overwrite)、重载(overload)和覆盖(override)
  2. 日志 log4j.xml配置详解
  3. SHE PWM的simulink仿真谐波分析
  4. linux根文件系统创建过程
  5. python创建float型的列表_如何在Python中进行列表的创建?
  6. 数组之间的计算matlab,matlab中的矩阵运算和数组运算方法
  7. VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题
  8. [Java2入门经典]第9章 访问文件和目录
  9. 红米note3支持html,红米note3如何检测硬件信息?指令代码说明
  10. JSPs only permit GET POST or HEAD的解决方案(REST风格)
  11. JavaScript实现秒杀倒计时效果(附源码)
  12. 2022-2028全球与中国卫星地面网络科技市场现状及未来发展趋势
  13. SEO主要是做什么的?零基础能学习吗?
  14. 功能齐全的 ESP32 智能手表,具有多个表盘、心率传感器硬件设计
  15. 使用python-docx将爬取结果保存到word
  16. IC在測試生產過程的靜電放電(ESD)擊傷及電性過壓(EOS)現象
  17. 亲身体验 北京-环球嘉年华!
  18. 腾讯嵌入式系统tos移植到正点原子阿波罗F429
  19. selenium模拟浏览器解决反监测,获取cookies解决登录问题
  20. runas自动输入密码普通用户以管理员权限自动安装软件

热门文章

  1. JavaScript奇淫技巧:隐写术
  2. 深入理解计算机系统 2.1 节信息存储,深入理解计算机系统(原书第3版)- 第2章 信息的表示和处理 笔记...
  3. MEM/MBA 写作-论说文(03)立意 答案解析
  4. Excel 中连续生成开始日期和结束日期之间的日期
  5. emu8086不支持的x86语法
  6. 固态硬盘数据恢复商家梳理
  7. 别只关注chatGPT能不能写论文了,它还支持49中场景,代码都给你写好了,速领
  8. 知识融合中几种计算文本相似度的方法(代码)
  9. Anaconda 虚拟环境:pyuic之找不到模块之最后的希望(最新)
  10. KNN(k-nearest neighbor的缩写)最近邻算法原理详解