多条件检索,结果高亮处理 (业务场景 索引库设计 实现流程)
场景:
当我们输入关键字搜索时,搜索结果中包含关键字的字段要用其他颜色标记出来
索引库设计:
默认情况下搜索字段要与高亮字段保持一致,若搜索字段为all,则需要加required_field_match=false属性
实现流程:

  1. // 1.准备Request
  2. SearchRequest request = new SearchRequest("hotel");
  3. // 2.准备DSL
  4. // 2.1.query
  5. request.source().query(QueryBuilders.matchQuery("all", "如家"));
  6. // 2.2.高亮
  7. request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
  8. // 3.发送请求
  9. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
  10. SearchHits hits = response.getHits();
  11. SearchHit[] searchHits = hits.getHits();
  12. for (SearchHit searchHit : searchHits) {
  13. Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
  14. if (!CollectionUtils.isEmpty(highlightFields)) {
  15. HighlightField name = highlightFields.get("name");
  16. String s = name.getFragments()[0].string();
  17. if (s!=null){
  18. hotelDoc.setName(s);
  19. }
  20. }
  21. }
  1. 按距离排序 查询离我最近的XXX (业务场景 索引库设计 实现流程)<br />业务场景:<br />当用户点击距离优先时,显示按照距离排序,并显示距离多远<br />索引库设计:<br />无<br />实现流程:
 // 1排序
        String location = params.getLocation();
        if (location != null && !location.equals("")) {
            request.source().sort(SortBuilders
                                  .geoDistanceSort("location", new GeoPoint(location))
                                  .order(SortOrder.ASC)
                                  .unit(DistanceUnit.KILOMETERS)
                                 );
        }

        // 2发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit searchHit : searchHits) {
    Object[] sortValues = searchHit.getSortValues();
            if (sortValues!=null&&sortValues.length>0) {
                System.out.println(sortValues.length);
                hotelDoc.setDistance(sortValues[0]);
            }
}
XXX竞价排名?  (业务场景 索引库设计 实现流程)<br />业务场景:<br />当用户交了广告费之后,想让自己的品牌出现在前列<br />索引库设计:<br />在索引库中添加是否缴纳广告费字段 isAD:boolean类型<br />实现流程
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

        // 关键字搜索
        String key = params.getKey();
        if (key == null || "".equals(key)) {
            boolQueryBuilder.must(QueryBuilders.matchAllQuery());

        } else {
            boolQueryBuilder.must(QueryBuilders.matchQuery("all", key));
            //高亮
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            HighlightBuilder field = highlightBuilder.field("name").requireFieldMatch(false);
            field.preTags("<em>");
            field.postTags("</em>");
            source.highlighter(highlightBuilder);
        }
        //对品牌多虑
        if (!StringUtils.isBlank(params.getBrand())) {
            TermQueryBuilder query = QueryBuilders.termQuery("brand", params.getBrand());
            boolQueryBuilder.filter(query);
        }
        //对城市过滤
        if (!StringUtils.isBlank(params.getCity())) {
            TermQueryBuilder query = QueryBuilders.termQuery("city", params.getCity());
            boolQueryBuilder.filter(query);
        }
        //对星级过滤
        if (!StringUtils.isBlank(params.getStarName())) {
            TermQueryBuilder query = QueryBuilders.termQuery("starName", params.getStarName());
            boolQueryBuilder.filter(query);
        }
        //对价格过滤,
        if (params.getMaxPrice() != null && params.getMinPrice() != null) {
            RangeQueryBuilder query = QueryBuilders.rangeQuery("price").gt(params.getMinPrice()).lt(params.getMaxPrice());
            boolQueryBuilder.filter(query);
        }
        //对价格过滤,
        if (params.getMaxPrice() != null && params.getMinPrice() == null) {
            RangeQueryBuilder query = QueryBuilders.rangeQuery("price").lt(params.getMaxPrice());
            boolQueryBuilder.filter(query);
        }
        //对价格过滤,
        if (params.getMaxPrice() == null && params.getMinPrice() != null) {
            RangeQueryBuilder query = QueryBuilders.rangeQuery("price").gt(params.getMinPrice());
            boolQueryBuilder.filter(query);
        }
        source.query(boolQueryBuilder);

        //是否投入广告,投入则排名靠前
        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
                boolQueryBuilder,
                new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                        new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                // 过滤条件
                                QueryBuilders.termQuery("isAD", true),
                                // 算分函数
                                ScoreFunctionBuilders.weightFactorFunction(100000)
                        )
                }).scoreMode(FunctionScoreQuery.ScoreMode.SUM);
        source.query(functionScoreQueryBuilder);
聚合查询搜索条件?   (业务场景 索引库设计 实现流程)<br />    自动补全及拼音查询?   (业务场景 索引库设计 实现流程)<br />业务场景:<br />当用户输入关键字,或拼音时,能够给予提示<br />    es和mysql数据同步思路?<br />通过RabbitMQ消息队列<br />    es如何保证高可用?(集群介绍)<br />    es集群中分片和副本介绍?<br />    es集群中的脑裂现象?<br />    es集群中的故障转移? (集群容错)

1.数据聚合

聚合的种类

聚合常见的有三类:

  • 桶(Bucket)聚合:用来对文档做分组
    • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
  • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
    • Avg:求平均值
    • Max:求最大值
    • Min:求最小值
    • Stats:同时求max、min、avg、sum等
  • 管道(pipeline)聚合:其它聚合的结果为基础做聚合

参加聚合的字段必须是keyword、日期、数值、布尔类型