【ES查询中的Java代码】

@Autowired
private RestHighLevelClient client;

public PageResult hotelList(SearchParam searchParam) {
    long total = 0;
    List<HotelDoc> hotelDocs = null;
    try {
        String key = searchParam.getKey();
        String sortBy = searchParam.getSortBy();
        Integer page = searchParam.getPage();
        Integer size = searchParam.getSize();

        //布尔查询
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        SearchRequest searchRequest = new SearchRequest(EsConstant.HOTEL_INDEX);
        if (StringUtils.isBlank(key)) {
            //关键字为空查所有
            boolQuery.must((QueryBuilders.matchAllQuery()));
        } else {
            //不为空查关键字
            boolQuery.must(QueryBuilders.matchQuery("all", key));
        }
        //brand的term过滤查询
        if (StringUtils.isNotBlank((searchParam.getBrand()))) {
            boolQuery.filter(QueryBuilders.termQuery("brand", searchParam.getBrand()));
        }
        //city的term过滤查询
        if (StringUtils.isNotBlank((searchParam.getCity()))) {
            boolQuery.filter(QueryBuilders.termQuery("city", searchParam.getCity()));
        }
        //starName的term过滤查询
        if (StringUtils.isNotBlank((searchParam.getStarName()))) {
            boolQuery.filter(QueryBuilders.termQuery("starName", searchParam.getStarName()));
        }
        //price的range范围查询
        Integer maxPrice = searchParam.getMaxPrice();
        Integer minPrice = searchParam.getMinPrice();
        if (maxPrice != null && minPrice != null) {
            boolQuery.filter(QueryBuilders.rangeQuery("price")
                    .gte(minPrice).lte(maxPrice));
        }
        //增加距离排序
        String location = searchParam.getLocation();
        if (StringUtils.isNotBlank(location)) {
            //排序sort
            searchRequest.source()
                    .sort(SortBuilders
                            .geoDistanceSort("location", new GeoPoint(location))
                            .order(SortOrder.ASC)
                            .unit(DistanceUnit.KILOMETERS));
        }

        //把条件放入请求
        searchRequest.source().query(boolQuery);
        
        //是否为广告
        searchRequest.source().query(
                new FunctionScoreQueryBuilder(boolQuery
                        , new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                        new FunctionScoreQueryBuilder
                                .FilterFunctionBuilder(QueryBuilders.termQuery("isAD", true)
                                , ScoreFunctionBuilders.weightFactorFunction(100.0f))
                })
                        .boostMode(CombineFunction.SUM));

        //分页查询
        searchRequest.source().from((page - 1) * size).size(size);
        //查询
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        //条数
        total = search.getHits().getTotalHits().value;
        hotelDocs = new ArrayList<>();
        SearchHit[] hits = search.getHits().getHits();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //获取sout距离
            Object[] sortValues = hit.getSortValues();
            //判断不为空和数组长度大于0
            if (sortValues != null && sortValues.length > 0) {
                Object sortValue = sortValues[0];
                if (sortValue != null) {
                    //放入到hlteldoc中
                    hotelDoc.setDistance(sortValue);
                }
            }
            hotelDocs.add(hotelDoc);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    //返回总条数和数据
    return new PageResult(total, hotelDocs);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值