@@ -42,22 +42,36 @@ public static List<SearchResult> aggregateSort(List<SearchResult> data, String k
4242 double authorScore = getSimilarity (data , kw , "author" );
4343 boolean isAuthorSearch = bookNameScore < authorScore ;
4444
45- return data .stream ()
46- // 筛选相似度大于 0.3 的记录
47- .filter (sr -> StrUtil .similar (kw , isAuthorSearch ? sr .getAuthor () : sr .getBookName ()) > 0.3 )
48- .sorted ((o1 , o2 ) -> {
49- double score1 = StrUtil .similar (kw , isAuthorSearch ? o1 .getAuthor () : o1 .getBookName ());
50- double score2 = StrUtil .similar (kw , isAuthorSearch ? o2 .getAuthor () : o2 .getBookName ());
51-
52- if (score1 != score2 ) {
53- return Double .compare (score2 , score1 ); // 按相似度降序
54- }
55-
56- return isAuthorSearch
57- ? o1 .getBookName ().compareTo (o2 .getBookName ()) // 按书名升序
58- : o1 .getAuthor ().compareTo (o2 .getAuthor ()); // 按作者升序
59- })
45+ // 缓存相似度
46+ Map <SearchResult , Double > similarityMap = new HashMap <>();
47+ for (SearchResult sr : data ) {
48+ String target = isAuthorSearch ? sr .getAuthor () : sr .getBookName ();
49+ double score = StrUtil .similar (kw , target );
50+ similarityMap .put (sr , score );
51+ }
52+
53+ // 排序器统一封装,复用
54+ Comparator <SearchResult > comparator = (o1 , o2 ) -> {
55+ double score1 = similarityMap .get (o1 );
56+ double score2 = similarityMap .get (o2 );
57+ if (score1 != score2 ) {
58+ return Double .compare (score2 , score1 ); // 按相似度降序
59+ }
60+ return isAuthorSearch
61+ ? o1 .getBookName ().compareTo (o2 .getBookName ())
62+ : o1 .getAuthor ().compareTo (o2 .getAuthor ());
63+ };
64+
65+ // 筛选相似度高的
66+ List <SearchResult > filtered = data .stream ()
67+ .filter (sr -> similarityMap .get (sr ) > 0.3 )
68+ .sorted (comparator )
6069 .toList ();
70+
71+ // 如果筛选后为空,则排序原始 data 返回
72+ return filtered .isEmpty ()
73+ ? data .stream ().filter (sr -> similarityMap .get (sr ) > 0 ).sorted (comparator ).toList ()
74+ : filtered ;
6175 }
6276
6377 // 计算权重,用于判断关键字是书名还是作者
0 commit comments