@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; }
1.es的查询几种查询方式
最新推荐文章于 2023-08-22 16:00:55 发布