Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Muhammad Umar 11 posts 121 karma points
    Nov 21, 2019 @ 16:19
    Muhammad Umar
    0

    Custom ISearchableTree to search content in backoffice - URL is not showing in search results

    Looking at umbraco default implementation, i can see that the AdditionalData["Url"] needs to be populated with URL value and i have implemented this as seen below but it still does not show the URL in search results.

        private List<SearchResultItem> MapSearchResults(IEnumerable<IPublishedContent> MatchingItems)
        {
            var SearchResults = new List<SearchResultItem>();
    
            foreach (var MatchingItem in MatchingItems)
            {
                int ParentID = MatchingItem.Parent != null ? MatchingItem.Parent.Id : -1;
                string Icon = ApplicationContext.Current.Services.ContentTypeService.GetContentType(MatchingItem.ContentType.Id).Icon;
                var SearchResultItem = new SearchResultItem();
                SearchResultItem.Alias = MatchingItem.DocumentTypeAlias;
                SearchResultItem.Key = MatchingItem.GetKey();
                SearchResultItem.Name = MatchingItem.Name;
                SearchResultItem.ParentId = ParentID;
                SearchResultItem.Path = MatchingItem.Path;
                SearchResultItem.Score = 1.0F;
                SearchResultItem.Trashed = false;
                SearchResultItem.Icon = Icon;
                SearchResultItem.Udi = new GuidUdi("document", MatchingItem.GetKey());
                SearchResultItem.AdditionalData["Url"] = MatchingItem.Url;
                SearchResults.Add(SearchResultItem);
            }
    
            return SearchResults;
        }
    
  • Muhammad Umar 11 posts 121 karma points
    Nov 22, 2019 @ 16:41
    Muhammad Umar
    0

    Full implementation:

    public class ContentSearchController : ISearchableTree
    {
        public String TreeAlias => "content";
        public IEnumerable<SearchResultItem> Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
        {
            var UmbracoHelper = new UmbracoHelper(UmbracoContext.Current);
            var RootNodes = UmbracoHelper.TypedContentAtRoot();
    
            var SearchResults = new List<SearchResultItem>();
            var MatchingItems = new List<IPublishedContent>();
    
            foreach (var RootNode in RootNodes)
            {
                var Results = RootNode.DescendantsOrSelf().Where(x => x.Name.ToLower().Contains(query.ToLower()));
                Results = Results != null && Results.Any() ? Results : RootNode.DescendantsOrSelf().Where(x => x.UrlAbsolute().ToLower().Contains(query.ToLower()));
                if (Results!= null && Results.Any())
                {
                    MatchingItems.AddRange(Results);
                }
            }
    
            if (MatchingItems != null && MatchingItems.Any()) {
                SearchResults = MapSearchResults(MatchingItems);
            }
    
            totalFound = MatchingItems != null ? MatchingItems.Count() : 0;
    
            return SearchResults;
        }
    
        private List<SearchResultItem> MapSearchResults(IEnumerable<IPublishedContent> MatchingItems)
        {
            var SearchResults = new List<SearchResultItem>();
    
            foreach (var MatchingItem in MatchingItems)
            {
                int ParentID = MatchingItem.Parent != null ? MatchingItem.Parent.Id : -1;
                string Icon = ApplicationContext.Current.Services.ContentTypeService.GetContentType(MatchingItem.ContentType.Id).Icon;
                var SearchResultItem = new SearchResultItem();
                SearchResultItem.Id = MatchingItem.Id;
                SearchResultItem.Alias = MatchingItem.DocumentTypeAlias;
                SearchResultItem.Key = MatchingItem.GetKey();
                SearchResultItem.Name = MatchingItem.Name;
                SearchResultItem.ParentId = ParentID;
                SearchResultItem.Path = MatchingItem.Path;
                SearchResultItem.Score = 1.0F;
                SearchResultItem.Trashed = false;
                SearchResultItem.Icon = Icon;
                SearchResultItem.Udi = new GuidUdi("document", MatchingItem.GetKey());
                SearchResultItem.AdditionalData["Url"] = MatchingItem.UrlAbsolute();
                SearchResults.Add(SearchResultItem);
            }
    
            return SearchResults;
        }
    }
    
  • Muhammad Umar 11 posts 121 karma points
    Nov 25, 2019 @ 12:26
    Muhammad Umar
    100

    I have found a fix after looking at ContentTreeController class and comparing the difference between my custom implementation. I found that ContentTreeController had this attribute applied to the class [SearchableTree("searchResultFormatter", "configureContentResult")] and after applying this to my implementation, it sttarted showing the URL in search results.

    Full implementation is below for anyone wanting to replace umbraco backoffice content search. It will search content by node name and url of content.

    https://our.umbraco.com/Documentation/Extending/Section-Trees/Searchable-Trees/index-v7/

        [SearchableTree("searchResultFormatter", "configureContentResult")]
    [Tree("content", "content")]
    [UmbracoApplicationAuthorize(new[] { "content", "media", "users", "settings", "developer", "member" })]
    public class ContentSearchController : ISearchableTree
    {
        public String TreeAlias => "content";
        public IEnumerable<SearchResultItem> Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
        {
            var UmbracoHelper = new UmbracoHelper(UmbracoContext.Current);
            var RootNodes = UmbracoHelper.TypedContentAtRoot();
    
            var SearchResults = new List<SearchResultItem>();
            var MatchingItems = new List<IPublishedContent>();
    
            foreach (var RootNode in RootNodes)
            {
                var Results = RootNode.DescendantsOrSelf().Where(x => x.Name.ToLower().Contains(query.ToLower()));
                Results = Results != null && Results.Any() ? Results : RootNode.DescendantsOrSelf().Where(x => x.UrlAbsolute().ToLower().Contains(query.ToLower()));
                if (Results!= null && Results.Any())
                {
                    MatchingItems.AddRange(Results);
                }
            }
    
            if (MatchingItems != null && MatchingItems.Any()) {
                SearchResults = MapSearchResults(MatchingItems);
            }
    
            totalFound = MatchingItems != null ? MatchingItems.Count() : 0;
    
            return SearchResults;
        }
    
        private List<SearchResultItem> MapSearchResults(IEnumerable<IPublishedContent> MatchingItems)
        {
            var SearchResults = new List<SearchResultItem>();
    
            foreach (var MatchingItem in MatchingItems)
            {
                int ParentID = MatchingItem.Parent != null ? MatchingItem.Parent.Id : -1;
                string Icon = ApplicationContext.Current.Services.ContentTypeService.GetContentType(MatchingItem.ContentType.Id).Icon;
                var SearchResultItem = new SearchResultItem();
                SearchResultItem.Id = MatchingItem.Id;
                SearchResultItem.Alias = MatchingItem.DocumentTypeAlias;
                SearchResultItem.Key = MatchingItem.GetKey();
                SearchResultItem.Name = MatchingItem.Name;
                SearchResultItem.ParentId = ParentID;
                SearchResultItem.Path = MatchingItem.Path;
                SearchResultItem.Score = 1.0F;
                SearchResultItem.Trashed = false;
                SearchResultItem.Icon = Icon;
                SearchResultItem.Udi = new GuidUdi("document", MatchingItem.GetKey());
                SearchResultItem.AdditionalData["Url"] = MatchingItem.UrlAbsolute();
                SearchResults.Add(SearchResultItem);
            }
    
            return SearchResults;
        }
    }
    
Please Sign in or register to post replies

Write your reply to:

Draft