关于补充需求中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

因为,最后,当我这边想用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
00
相似问题
手动创建索引Mapping的步骤流程问题
回答 1
关于面试准备的问题
回答 1