D8UPuf>$vWZ=e((V>&*=419x`;zpUo<1)#>ENOu`
zl8*{0#5@^hv4PR5d|<4$m{TY4)mu!f?>Cs1vxBOs_)%u16|vKy!vAh$W5>-Dn-i
zk22?|fP76_^0fvj_f5t)p1{Q}duo@I
z(ne{%&9RrmDJHwYo~7OO9LJueJ+vpu_cHSlNp~%zdlApO(^3y!=W>B+Z%&-2eT=s?
zhq@$3YNQ<5oV}ZoS&kIkhg_^c0q#dHJb(dskX7;!E8<~Xibt6F)tHYpxC(0-oX2r9
z*5P(M!I||OZNO%1WHg_|%c#X`*n+pQ4If}Tj$#Ln;b{>((@+M_Ba|MggR3x6`!cIu
z#zdoja?~#zSB^|=C@FsB)Pajck7|F$+D*FeICbD5=~taPh;iy57w(hf@AZPMe}ET>
zUNrNfMfe{`PB@ON1<^S5V|Z94v_6n&W=8CoZgt^m7>Z<0?56EK2;e1TVjuFk8G6vc
ze%Oz}#Kky(aX83r^cLpwUX8=7oA+=F6MQ?z%kd#r;p0ZtvpVV}R!6*K_#NMrR_@S2
z^t_vk#+K?}9TF)YkEkK~lVvQOw8+`~m1j?kB=$P6=oxwoUogdAvlSde9=>G*_>O`3
zp3F~h+t*_vPNI}sd6sx^rNrQ7@nX67uts9BK`dynDt$%)D6UiyMOUPfKsgR>Am9qIJT?o?k1E)rxngpiXFs%MO57;>12~;n)E@BWASkmMbj`Tl7{#YS2Q{w68(CqmQcnX?QUy&H2J<5td$ps
zYi|Z&?_<=qkeBD#S@nB)AGv$liPpS#sqd6<3-5D02eZwa#-y0fj%?(;Z+<{tsdbXz
z>b(-@629udu5QAP`JsTk=HOfpadS@ZcVJ2kVFKab9q94)Zn~Q4;Oc39`RC@9%W6*K
zb%Ndu=XE!UzV2Irp}fBlkVCcd_A>M)cqbt5IiP^xNI*VtKrTV(qkw$spfsX?1>`>t
zh;=IL35tH9KC1idC)KgYBI>k~YNPZ*I-MxWPsbBP`RQ&CD+>vt-pcG?ZK%OrncT=-85MTd(I*4zq>;XJ
z8tV%-*4K<68a+uQVDub!#YMpAedW+QRwwL(VS1qz_=s~+emF=F<%hilQGM7&Kz(03
zDmD^OU)bH1b<#en?-vyx)rC$gzJ~Cz+x@z1oLSvg`DT1TzTG6p8Oul$ia|&S@|*_Z
zyivJc)G0cZdtojz~IzbNLD(@%)R+J&qA)`u`Rq*gN>06Yd?D$IfB8cuszhZR5li
zb9(GVQ7wkt1+RN0+^)?su2x;4QytNH)t5Gnnpuu>Xi^Jubh^%nG_!Q*IIq;7q*%Rj
zKZoXCFSO6Eu8957v}f$6f}ms&QPvEN+X**l9Kxx
z3;go?g%%iK$v&fjP}Hji3;fuOSU8IwnDoR3-Qi%FST#Cvaq?8&_}*_K1XASZ?9Znd
zqRQ|$R{a?{o=y=yE$4v}{%ULK5G2K9|7P{oXuP2)r(Oz>2T$aEVy;#=^yfL}zxn!{
zPj5n%6s|#nR#C7>f5+w5=pXf3y}f}~L>l|7WL5D=6IA*_iepw>#KxP$%t
zr0@IM535yLzXAbe2@N4o1uHIC5uvprDj@E)6qUL`puhKK5@M}?NO*Ja@7(*&`JL^)
z`>R#5{np@t3$0HADA)T8sGz?kS!q^Mnz1d?n33q04YJXYMpHIfzss?>FsDzO@)v7YsL-=t(5Igj4D=pnD|yb8=W&I=r0y|GZ&)&7
zNmWCG4>|VQi>Cb5UQ3U!Ra7rqP&aSN!kXHuWy|YHF3pEgJ~<>Pus+ENSsSyHygs~a
z$PsIIc3=6sbt*eQ^RWEGgn?4O9F^A%Ic7=|(ga0LAcpnJ3MI-qdDE1)gv4C5WN$oS
z%1L?Kn$xW$coY}>@~*sR$or;zARk(fbeq&q{%Oj`@-M!yq^?GgGQO_9rleuX{DF%~
z#@E%`+WP8JUAcJYpj!nVQXR!kF}$)SHc`W4$A96y`Ivm
z&3S&U#$H1X1+|8P-q!S@+{A^pszs(Q)+N^MMW>SM{P61yrv6Z`3~Ig2a80i)tF&9X
zx2#}hP?uSoinIINWN*6J)L}Y2sKZIo
zrj~PuSMRXVou*!)Lz&qzwYAmtPF|}U482Ft+bS*0uzHjl*13`d_bNe7T#y-+)67-K
zjxCE;u^RV5SQFM^)eX^axIq0A}p7iaEn8E780l+AYaMX
z^b~S)oV-0dC+BU4IBSy&OhdBFmx~IxkSo(wRN@gAVK9EmA3J*Gs+-q0w4c1khz*jgU{kQ#`aU|#DKC`&_dJ++(D*y
zA_;e)EAB=P?m-y$Iz9}fbs*Bt91%6i*G@}ByO0Mda~9AfGEYFB1~nOOwYhY0smVlk
z;S(SfoWeVH#yFqF&8{dXW_SngjTG*}Nf)*fyE>)aa_r}FEBAHSH#J359s8!HX;-MG
z+v{;jie}K=SR^!smecrTa)W9X7ebnCdr#N}uBNO(X1sE0kY+(OY2a9-?K*kz`A%0^RWT-td*76#87R<{dgR|#uNA>w(xH&TCkllZo*60fg{+7
zx6q3Bn84H6gU_*71W$Jq$8%Ve5wDJwn62HIYi3on-CLGH_gJ(kvnxhP@vKuFE)qSh
zIn02YbdNjL;UVe6PIY*l>d1%tBKaEz{D$_h0)sO$d8zqDOUO5)>uJ|
z1>?pt3*ZH$;sCPfNd$*51g~H?`(hMv1zu&p9AzgRLmkKEIL?wefd_Dsu{e&0@Gdsu
z{Z0kc*zOV<<1Pj8kmHEb%5OA}ZVq(O*c#2(UhxX@h}uN|ZzW5y_ICQeameg=7Vkz+
zGXI#xaEAH(jHkg_6tHuP@Fk=0HJP7d$DhY+w4qv*9qhsicJ=+@!9(K3W-+i`{Advq
zFG?4@BFT6|Qt-BP#Yd8X)9n1OB}?2Ak_5??bm=Z($(3S>_LQNLCnF_a#z`N??OR#1
z=@_Jav@iS;Mo;ah1xUnVoY1gFnCBHZsD)a@lc5Ec7E_i$XDiwRB^B+JPFd`X;HncS
z7qX?lb6U8OClM{VoMqraf%MW+2G8rX1REz#;Ia+^{Yk)9lA;5cdc!I!>l=-?DwA#>
z8_FXz-Y^4$ejTKj$4+P_f-TEEN5ajre!P}Pnq~7QhWmOx?){4|9OO9ULUGaq9H)7X
zWhZkScb7-kBZqjKgVQ`*P9ogyK##Y)TO;3>
znf$T;*+)SRpQU{EP@YIKJA9AIV2(RerL|f1td%gqpHpS81G*FJOO%%dEc6~TV(5?^r2-@{w2LbgRbkwbH6-K&U-C8bn
zsQV>Bhq`Du+DTu1OyA3nit3oY7`@6?>32!r*v|UOJL@YY=%ANRKzgq@>e2~FFQzV`
zRhZ|kyXEkVXsY~er@Z=<9o%TzDCYf6#AauIx`kZY0b~d2N@xq1cNt%^3Y44EK7tT`f}CEXTLmUx7}B*+KTl
zK0Wrb(=&v~)iV8oU9y~KKr0P7dXZB#WF4pWcvNVgSEIQ7DO6zFPowoyv>N8~Slsev
z$~#QbK0Ei4%`~TlxC3dOY1S%B!2nr2!RxN@BAJV>3{5&b^g0KeuE->I-=v=*3%(KiYfjUd8bJ}vhQxv
zxsKq8A16Q3t8Mx^vi+{9qX$IxV+FYIQ
zpapR0Qmxe+)t)uza=pcwE!CgKWtDoHu87N`9s6$A
+
+
+
diff --git a/service/service-search/pom.xml b/service/service-search/pom.xml
index ba14291..6e59f97 100644
--- a/service/service-search/pom.xml
+++ b/service/service-search/pom.xml
@@ -36,6 +36,21 @@
org.apache.kafka
kafka-streams
+
+ io.github.biezhi
+ TinyPinyin
+ 2.0.3.RELEASE
+
+
+ com.belerweb
+ pinyin4j
+ 2.5.1
+
+
+ com.github.stuxuhai
+ jpinyin
+ 1.1.8
+
diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java
index 3b67ae2..4c728c9 100644
--- a/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java
+++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java
@@ -3,6 +3,7 @@ package com.atguigu.tingshu.search.api;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.search.service.SearchService;
+import com.atguigu.tingshu.vo.search.AlbumInfoIndexVo;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -69,6 +70,34 @@ public class SearchApiController {
return Result.ok(list);
}
+ /**
+ * 根据用户已录入字符展示提示词下拉列表(最多10个)
+ * @param keyword
+ * @return
+ */
+ @Operation(summary = "根据用户已录入字符展示提示词下拉列表(最多10个)")
+ @GetMapping("/albumInfo/completeSuggest/{keyword}")
+ public Result> completeSuggest(@PathVariable String keyword) {
+ List list = searchService.completeSuggest(keyword);
+ return Result.ok(list);
+ }
+ /**
+ * 更新Redis小时榜数据
+ * @return
+ */
+ @Operation(summary = "更新Redis小时榜数据")
+ @GetMapping("/albumInfo/updateLatelyAlbumRanking/{top}")
+ public Result updateLatelyAlbumRanking(@PathVariable("top") Integer top){
+ searchService.updateLatelyAlbumRanking(top);
+ return Result.ok();
+ }
+ @Operation(summary = "获取不同分类下不同排行维度TOP20")
+ @GetMapping("/albumInfo/findRankingList/{category1Id}/{dimension}")
+ public Result> getRankingList(@PathVariable Long category1Id, @PathVariable String dimension){
+ List list = searchService.getRankingList(category1Id, dimension);
+ return Result.ok(list);
+ }
+
}
diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/receiver/SearchReciever.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/receiver/SearchReciever.java
index 439dc83..2928f2d 100644
--- a/service/service-search/src/main/java/com/atguigu/tingshu/search/receiver/SearchReciever.java
+++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/receiver/SearchReciever.java
@@ -1,7 +1,9 @@
package com.atguigu.tingshu.search.receiver;
+import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.search.service.SearchService;
+import com.atguigu.tingshu.vo.album.TrackStatMqVo;
import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -11,8 +13,11 @@ import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
+import java.util.concurrent.TimeUnit;
+
/**
* @author: atguigu
* @create: 2025-07-22 15:22
@@ -23,6 +28,8 @@ public class SearchReciever {
@Autowired
private SearchService searchService;
+ @Autowired
+ private RedisTemplate redisTemplate;
/**
* 监听专辑上架消息
@@ -63,4 +70,38 @@ public class SearchReciever {
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
-}
+
+// /**
+// * 监听更新声音/搜索统计信息
+// *
+// * @param mqVo
+// * @param message
+// * @param channel
+// */
+//
+// @RabbitListener(bindings = @QueueBinding(
+// exchange = @Exchange(value = MqConst.EXCHANGE_TRACK, durable = "true"),
+// value = @Queue(value = MqConst.QUEUE_ALBUM_ES_STAT_UPDATE, durable = "true"),
+// key = MqConst.ROUTING_TRACK_STAT_UPDATE)
+// )
+// @SneakyThrows
+// public void updateStat(TrackStatMqVo mqVo, Message message, Channel channel){
+// if (mqVo != null)log.info("更新声音/专辑统计信息:{}", mqVo);
+// //1.幂等性处理
+// //1.1 从MQ消息对象中获取消息唯一标识
+// String key = RedisConstant.BUSINESS_PREFIX + "db:" + mqVo.getBusinessNo();
+// //1.2 尝试采用set nx写入Redis
+// Boolean flag = redisTemplate.opsForValue().setIfAbsent(key, "1", 5, TimeUnit.MINUTES);
+//
+// //1.3 写入成功消息才进行业务处理,写入失败(消息重复被MQ服务器投递)忽略消息
+// if (flag) {
+// //2.业务处理
+// searchService.upperAlbum(mqVo.getAlbumId());
+//
+// }
+// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+// }
+
+
+ }
+
diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/AlbumInfoIndexRepository.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/AlbumInfoIndexRepository.java
index d5a69e5..a8b269b 100644
--- a/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/AlbumInfoIndexRepository.java
+++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/AlbumInfoIndexRepository.java
@@ -2,6 +2,6 @@ package com.atguigu.tingshu.search.repository;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
-
+//当启动这个服务的启动类的时候 当检测到有这个接口,可以自动创建索引库
public interface AlbumInfoIndexRepository extends ElasticsearchRepository {
}
diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/SuggestIndexRepository.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/SuggestIndexRepository.java
new file mode 100644
index 0000000..366e9bc
--- /dev/null
+++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/repository/SuggestIndexRepository.java
@@ -0,0 +1,7 @@
+package com.atguigu.tingshu.search.repository;
+
+import com.atguigu.tingshu.model.search.SuggestIndex;
+import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
+
+public interface SuggestIndexRepository extends ElasticsearchRepository {
+}
diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java
index 25ee879..bc9e9fa 100644
--- a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java
+++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java
@@ -1,8 +1,13 @@
package com.atguigu.tingshu.search.service;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import com.atguigu.tingshu.model.search.AlbumInfoIndex;
+import com.atguigu.tingshu.model.search.SuggestIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
+import com.atguigu.tingshu.vo.search.AlbumInfoIndexVo;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -18,5 +23,18 @@ public interface SearchService {
List