请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于补充需求中articles索引结构的一些问题-2

相关代码如下:关于列表数据的排序问题,比如:在REDIS中,可以看到

@Override
public List<ArticleEO> queryEsHotArticleList() { 
    // 从REDIS中获取分数由高到底的前5个articleId
    Set<String> articleIds = redis.reverseZsetRange(REDIS_ARTICLE_HOT_ARTICLE_SCORE,
                            0,
                            REDIS_ARTICLE_HOT_ARTICLE_NUM - 1);
     // FIXME:
//        List<String> articleIds = Arrays.asList("230405FSD2D5WSFW",
//                                                "230405FS91XNK4ZC");
     BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 想通过termsQuery来实现类似SQL中的IN查询
    // boolQuery.must(QueryBuilders.termsQuery("id", articleIds));
         // 想通过循环termQuery来实现类似SQL中的IN查询,也就是OR查询
    if (articleIds != null && articleIds.size() > 0)
    {
        for (String articleId: articleIds)
        {
            boolQuery.should(QueryBuilders.termQuery("id", articleId));
        }
    }
     SearchQuery searchQuery = new NativeSearchQueryBuilder().
                      withQuery(boolQuery).
                      build();
     System.out.println(searchQuery.getQuery());
     List<ArticleEO> articleEsList = esTemplate.queryForList(searchQuery, ArticleEO.class);
     return articleEsList;
}

articleId:230405FWMDRYC1KP,score分数更高

https://img1.sycdn.imooc.com//szimg/642d8ddc09d3d52204610158.jpg

然而,最终的列表接口返回数据的时候,分数更高的articleId却排到了第2位,感觉这个实现就不太好了。

https://img1.sycdn.imooc.com//szimg/642d8e460953357e08730612.jpg

我这边DEBUG了一下,就是代码里面拿到的articleId的顺序也是符合score从高到底排序的。

https://img1.sycdn.imooc.com//szimg/642d8ec609a4897c14980653.jpg

然而,最后经过ES这边不论是terms还是逐个term的匹配,都没法拿到预期的排序列表数据,用articleId字段来做SORT也不对,怎么才能按照和REDIS中相同的排序顺序从ES中拿到相同顺序的数据呢?我的想法是在articles索引里面再添加一个类似readCounts的字段,其实也就是阅读数,然后,在每次修改ZSET的时候,也修改一下articles中的readCounts的值,最后根据readCounts来进行降序排序。不然,好像没法拿到预期的排序了,但是,这么做又感到很多余且很麻烦,又得修改索引结构了,索引重建似乎挺麻烦的,而且,又有点重复修改两块数据源(ES和REDIS)的意味。还有一个想到的方案,就是再拿REDIS中articleId的时候,把score的值也拿出来,最后,在业务层通过整合REDIS和ES中的数据做一下DOC数据关于score的降序排序处理。不知道老师,您这边有什么建议方案么?


正在回答 回答被采纳积分+3

1回答

风间影月 2023-04-07 13:05:49

Redis的分数和es的分数不一样的,es有自己的机制,根据搜索条件进行的自动匹配的

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号