1.es的查询几种查询方式

@Override
public List<SearchEntity> new_recommend(String userId){
    String REDIS_PREFIX = "com.miyuan.scrollCache::";
    List<SearchEntity> rankList = new ArrayList<SearchEntity>();
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    String defaultKey = userId;
    final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(10L));
    //1.获取redis用户偏好
    List<String> list = this.redisTemplate.opsForList().range(defaultKey, 0L, 7L);

    Map<String,Double> cateMap = new HashMap<String,Double>();
    cateMap.put("total",0.0);
    JSONObject object = JSONUtil.parseObj(list.get(0));
    //2.根据类目信息召回商品,类目权重高前三(待补充类目权重高类目优先,类目多的用户只选择前几个类目)
    for(Map.Entry<String,Object> entry:object.entrySet()) {
        //存放类目偏好权重
        cateMap.put(entry.getKey(),(Double)entry.getValue());
        cateMap.put("total", cateMap.get("total")+(Double)entry.getValue());
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category_name.keyword", entry.getKey());
        boolQueryBuilder.should(termQueryBuilder);
    }

    //redis中查询用户的上次查询的页面
    String scrollId = this.redisTemplate.opsForValue().get(REDIS_PREFIX+userId);

    SearchScrollRequest scrollRequest = null;
    SearchSourceBuilder searchSourceBuilder = null;

    try{
        SearchRequest searchRequest = new SearchRequest("item_category");
        SearchResponse searchResponse = new SearchResponse();

        if(!StringUtils.isEmpty(scrollId)){
            scrollRequest = new SearchScrollRequest(scrollId);
            scrollRequest.scroll(scroll);
            searchResponse = client.searchScroll(scrollRequest).get();
        }else{
            searchSourceBuilder = new SearchSourceBuilder().size(100);
            searchSourceBuilder.query(boolQueryBuilder);
            searchRequest.scroll(scroll);
            searchRequest.source(searchSourceBuilder);
            searchResponse = client.search(searchRequest).get();
        }

        String returnScrollId = searchResponse.getScrollId();
        this.redisTemplate.opsForValue().set(REDIS_PREFIX+userId,returnScrollId);
        SearchHit[] searchHits = searchResponse.getHits().getHits();
        int len = searchHits.length;

        //获取每个商品的打分顺序
        for (int i = 0; i < len; i++) {
            String json = searchHits[i].getSourceAsString();
            SearchEntity b = JSONUtil.toBean(json,SearchEntity.class);
            //2.召回商品进行排序
            Double score = (cateMap.get(b.getCategory_name())/cateMap.get("total"))*0.7 + ((b.getSale_month()-1000)/(100000-1000))*0.2 + (b.getCommission()/100)*0.1;
            b.setScore(score);
            rankList.add(b);
        }

        //返回列表进行排序
        Collections.sort(rankList,new MyCompator());
    }catch (Exception e){
        e.printStackTrace();
    }
    return rankList;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值