From f1fa0401c2eaa596252fefda8ae8e53501a3e760 Mon Sep 17 00:00:00 2001 From: chfei Date: Thu, 15 Oct 2026 17:14:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7=E6=94=B6?= =?UTF-8?q?=E8=97=8F=E6=9F=A5=E8=AF=A2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/UserFavoritesIndexService.cs | 144 +++++++++--------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/Modules/CloudProduct/Services/UserFavoritesIndexService.cs b/Modules/CloudProduct/Services/UserFavoritesIndexService.cs index 736415b..af9c04c 100644 --- a/Modules/CloudProduct/Services/UserFavoritesIndexService.cs +++ b/Modules/CloudProduct/Services/UserFavoritesIndexService.cs @@ -330,80 +330,80 @@ namespace Store.Modules.CloudProduct.Services try { searchResponse = await _client.SearchAsync(s => s - .Index(_indexName) - .Query(q => q - .Bool(b => - { - // 只检索当前用户自己的收藏 - b.Filter(f => f.Term(t => t.Field(x => x.UserName).Value(request.UserName))); - - var filters = new List, QueryContainer>>(); - - if (groupId.HasValue) - { - filters.Add(f => f.Term(t => t.Field(x => x.GroupId).Value(groupId.Value))); - } - else if (string.IsNullOrWhiteSpace(groupName) == false) - { - filters.Add(f => f.Term(t => t.Field(x => x.GroupName).Value(groupName))); - } - - if (request.Platform.HasValue && request.Platform.Value > 0) - { - filters.Add(f => f.Term(t => t.Field(x => x.Platform).Value(request.Platform.Value))); - } - - if (request.CatId1.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId1).Value(request.CatId1.Value))); - if (request.CatId2.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId2).Value(request.CatId2.Value))); - if (request.CatId3.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId3).Value(request.CatId3.Value))); - if (request.CatId4.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId4).Value(request.CatId4.Value))); - - if (request.MinPrice.HasValue || request.MaxPrice.HasValue) - { - filters.Add(f => f.Range(r => - { - var range = r.Field(x => x.MinPrice); - if (request.MinPrice.HasValue) range = range.GreaterThanOrEquals(request.MinPrice.Value); - if (request.MaxPrice.HasValue) range = range.LessThanOrEquals(request.MaxPrice.Value); - return range; - })); - } - - if (request.MinSoldQuantity.HasValue || request.MaxSoldQuantity.HasValue) - { - filters.Add(f => f.Range(r => - { - var range = r.Field(x => x.SoldQuantity); - if (request.MinSoldQuantity.HasValue) range = range.GreaterThanOrEquals(request.MinSoldQuantity.Value); - if (request.MaxSoldQuantity.HasValue) range = range.LessThanOrEquals(request.MaxSoldQuantity.Value); - return range; - })); - } - - if (filters.Count > 0) b.Filter(filters.ToArray()); - - if (string.IsNullOrWhiteSpace(keyword) == false) - { - b.Must(m => m.Match(mm => mm.Field(f => f.Title).Query(keyword))); - } - - return b; - }) - ) - .Sort(sort => sortBy switch + .Index(_indexName) + .Query(q => q + .Bool(b => { - UserFavoritesSortBy.CreatedTimeAsc => sort.Ascending(f => f.CreatedAt), - UserFavoritesSortBy.PriceAsc => sort.Ascending(f => f.MinPrice), - UserFavoritesSortBy.PriceDesc => sort.Descending(f => f.MinPrice), - UserFavoritesSortBy.SoldDesc => sort.Descending(f => f.SoldQuantity), - _ => sort.Descending(f => f.CreatedAt) + var filters = new List, QueryContainer>>(); + + // 只检索当前用户自己的收藏 —— 放进 filters,避免被后面的 Filter 覆盖 + filters.Add(f => f.Term(t => t.Field(x => x.UserName).Value(request.UserName))); + + if (groupId.HasValue) + { + filters.Add(f => f.Term(t => t.Field(x => x.GroupId).Value(groupId.Value))); + } + else if (string.IsNullOrWhiteSpace(groupName) == false) + { + filters.Add(f => f.Term(t => t.Field(x => x.GroupName).Value(groupName))); + } + + if (request.Platform.HasValue && request.Platform.Value > 0) + { + filters.Add(f => f.Term(t => t.Field(x => x.Platform).Value(request.Platform.Value))); + } + + if (request.CatId1.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId1).Value(request.CatId1.Value))); + if (request.CatId2.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId2).Value(request.CatId2.Value))); + if (request.CatId3.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId3).Value(request.CatId3.Value))); + if (request.CatId4.HasValue) filters.Add(f => f.Term(t => t.Field(x => x.CatId4).Value(request.CatId4.Value))); + + if (request.MinPrice.HasValue || request.MaxPrice.HasValue) + { + filters.Add(f => f.Range(r => + { + var range = r.Field(x => x.MinPrice); + if (request.MinPrice.HasValue) range = range.GreaterThanOrEquals(request.MinPrice.Value); + if (request.MaxPrice.HasValue) range = range.LessThanOrEquals(request.MaxPrice.Value); + return range; + })); + } + + if (request.MinSoldQuantity.HasValue || request.MaxSoldQuantity.HasValue) + { + filters.Add(f => f.Range(r => + { + var range = r.Field(x => x.SoldQuantity); + if (request.MinSoldQuantity.HasValue) range = range.GreaterThanOrEquals(request.MinSoldQuantity.Value); + if (request.MaxSoldQuantity.HasValue) range = range.LessThanOrEquals(request.MaxSoldQuantity.Value); + return range; + })); + } + + // 统一一次性应用所有 filter,避免覆盖 + b.Filter(filters.ToArray()); + + if (string.IsNullOrWhiteSpace(keyword) == false) + { + b.Must(m => m.Match(mm => mm.Field(f => f.Title).Query(keyword))); + } + + return b; }) - .From(from) - .Size(pageSize) - .TrackTotalHits(true) // 命中数超过 10000 时默认不精确统计,需要显式开启 - .RequestConfiguration(r => r.RequestTimeout(QueryTimeout)) - ); - } + ) + .Sort(sort => sortBy switch + { + UserFavoritesSortBy.CreatedTimeAsc => sort.Ascending(f => f.CreatedAt), + UserFavoritesSortBy.PriceAsc => sort.Ascending(f => f.MinPrice), + UserFavoritesSortBy.PriceDesc => sort.Descending(f => f.MinPrice), + UserFavoritesSortBy.SoldDesc => sort.Descending(f => f.SoldQuantity), + _ => sort.Descending(f => f.CreatedAt) + }) + .From(from) + .Size(pageSize) + .TrackTotalHits(true) + .RequestConfiguration(r => r.RequestTimeout(QueryTimeout)) + );} catch (OpenSearchClientException ex) when (ex.Response?.Success == false) { throw new AppException($"收藏检索超时或失败({QueryTimeout.TotalSeconds}秒): " + ex.Message);