private void SetupFacets <T, TU>(EsRootObjectBase <T> results, SearchResultBase <TU> searchResult)
        {
            Dictionary <string, Aggregation> facets = results.Aggregations;

            if (facets?.Any() == true)
            {
                searchResult.Facets = facets.Select(f => new FacetEntry
                {
                    Key   = f.Key,
                    Count = f.Value.Facets.Length,
                    Hits  = f.Value.Facets.Select(i => new FacetHit
                    {
                        Key   = i.Key,
                        Count = i.Count
                    }).ToArray()
                }).ToArray();
            }
        }
Example #2
0
 public IAsyncOperation<SearchResultBase> SearchBrief(string keyword)
 {
     if (keyword == null || keyword?.Length == 0)
         throw new ArgumentException("搜索内容不能为空");
     return Run(async token =>
     {
         try
         {
             LogService.DebugWrite($"Search key {keyword} briefly", nameof(WebApi));
             var gettask = HttpHelper.GetAsync($"http://www.xiami.com/ajax/search-index?key={System.Net.WebUtility.UrlEncode(keyword.Replace(' ','+'))}&_={ParamHelper.GetTimestamp()}");
             token.Register(() => gettask.Cancel());
             var content = await gettask;
             HtmlDocument doc = new HtmlDocument();
             doc.LoadHtml(content);
             var categories = doc.DocumentNode.SelectNodes(".//tr");
             List<ArtistModel> ams = null;
             List<AlbumModel> abms = null;
             List<SongModel> sms = null;
             foreach (var item in categories)
             {
                 var lis = item.Descendants("li");
                 switch(item.Descendant("h3")?.InnerText)
                 {
                     case "歌曲":
                         sms = lis.Select((node) =>
                         {
                             var linknode = node.Element("a");
                             var linkt = linknode.GetAttributeValue("href", "/0?");
                             var song = SongModel.GetNew(ParseXiamiID(linkt));
                             song.TrackArtist = linknode.LastChild.InnerHtml;
                             song.NameHtml = linknode.InnerHtml.Substring(0, linknode.InnerHtml.IndexOf("- <span>"));
                             //System.Diagnostics.Debugger.Break();
                             return song;
                         }).ToList();
                         break;
                     case "专辑":
                         abms = lis.Select((node) =>
                         {
                             var linknode = node.Element("a");
                             var linkt = linknode.GetAttributeValue("href", "/0?");
                             var album = AlbumModel.GetNew(ParseXiamiID(linkt));
                             if (album.Art.Host == "")
                             {
                                 var art = linknode.Descendant("img").GetAttributeValue("src", AlbumModel.LargeDefaultUri);
                                 album.Art = new Uri(art.Replace("_3", "_2"));
                                 album.ArtFull = new Uri(art.Replace("_3", ""));
                             }
                             var snode = linknode.Descendant("strong");
                             album.NameHtml = snode.InnerHtml;
                             album.ArtistHtml = snode.ParentNode.ChildNodes.Last().InnerHtml.Trim();
                             return album;
                         }).ToList();
                         break;
                     case "艺人":
                         ams = lis.Select((node) =>
                         {
                             var linknode = node.Element("a");
                             var linkt = linknode.GetAttributeValue("href", "/0?");
                             var artist = ArtistModel.GetNew(ParseXiamiID(linkt));
                             artist.Art = new Uri(linknode.Descendant("img").GetAttributeValue("src", ArtistModel.LargeDefaultUri));
                             artist.NameHtml = linknode.Descendant("strong").InnerHtml;
                             return artist;
                         }).ToList();
                         break;
                     default:
                         break;
                 }
             }
             SearchResultBase result = new SearchResultBase() { Songs = sms, Artists = ams, Albums = abms };
             LogService.DebugWrite($"Finish Searching {keyword}", nameof(WebApi));
             return result;
         }
         catch (Exception e)
         {
             LogService.ErrorWrite(e, nameof(WebApi));
             throw e;
         }
     });
 }