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

来源:15-18 redis拓展作业 - 首页热闻实现思路

慕勒3498910

2023-04-07

https://coding.imooc.com/learn/questiondetail/jlqGxXzRvpbXe1Dk.html

上一节课程视频中的问题太集中了,不太好,重新打散问一下吧!

老师:你好。根据课程视频中提供的"首页热闻列表接口"的实现思路,我这边自己先按照思路实现了一下,然后,在实现中遇到有几个问题,想请教一下。整体来说通过阅读文章详情的时候,添加阅读数的方法里面,我这边设置ZSET类型的KEY="redis_article_hot_article_score",最终根据SCORE从高到底取5个articleId,然后,再从ES中拿到5个articleId对应DOC数据返回过程中,有遇到以下几个问题:

1、首先,遇到这样一个问题,就是之前articles索引的id的类型,之前设置为text,好像有些不妥,我感觉应该设置为"keyword"类型好像更好一些。

https://www.imooc.com/wiki/imoocnewsarchitect/f234r32r23.html

https://img.mukewang.com/szimg/642d8abf092b3c4610850469.jpg

因为,最后,当我这边想用term或者terms来进行类似SQL查询中的IN语法匹配查询的时候,发现这个text类型,没法匹配上,得用matchQuery了,感觉没有必要。相关代码如下:

@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;
}


写回答

1回答

风间影月

2023-04-07

嗯可以id用keyword吧,没必要text

0
0

Spring Cloud 进阶 Alibaba 微服务体系自媒体实战

一课收获分布式系统开发,微服务核心技术和中间件企业生产落地

1113 学习 · 896 问题

查看课程