+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / Search By Category

Search By Category

6 posts, 0 answered
  1. Paul
    Paul avatar
    13 posts
    Registered:
    29 Jul 2015
    08 Feb
    Link to this post

     

    Hi

    I have tried to do a search by category code is below. However when i preform the search it does not get items based on the categories. Does anyone have any advice?

    var service = Telerik.Sitefinity.Services.ServiceBus.ResolveService<ISearchService>();
                var queryBuilder = ObjectFactory.Resolve<IQueryBuilder>();
     
                ISearchQuery searchQuery = queryBuilder.BuildQuery(query, searchFields);
                searchQuery.IndexName = indexName;
                searchQuery.HighlightedFields = highlightedFields;
     
                var currentFilter = searchQuery.Filter;
                var categoriesFilter = new SearchFilter();
                categoriesFilter.Operator = QueryOperator.Or;
     
                categoriesFilter.AddClause(new SearchFilterClause("Category", category, FilterOperator.Contains));
     
                if (currentFilter != null) categoriesFilter.AddFilter(currentFilter);
                searchQuery.Filter = categoriesFilter;
     
                IResultSet result = service.Search(searchQuery);

     

  2. Velizar Bishurov
    Velizar Bishurov avatar
    143 posts
    Registered:
    09 Dec 2016
    12 Feb
    Link to this post
    Hello,

    I would suggest checking whether the field name is actually "Category". By default when adding a categories field to a dynamic module for example the name is "Categories".

    Also check whether the field has been added to the additional fields for indexing of the search index.

    Regards,
    Velizar Bishurov
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
  3. Paul
    Paul avatar
    13 posts
    Registered:
    29 Jul 2015
    12 Feb in reply to Velizar Bishurov
    Link to this post

    Hi Velizar,

     

    It is definitely called category, I had catgories originally but when I inspected the index using luke.net it was showing up as blank.

    Thanks

  4. Velizar Bishurov
    Velizar Bishurov avatar
    143 posts
    Registered:
    09 Dec 2016
    18 Feb
    Link to this post
    Hi,

    Try the following sample code:

    var control = this.control;
    var service = Telerik.Sitefinity.Services.ServiceBus.ResolveService<ISearchService>();
    var queryBuilder = ObjectFactory.Resolve<IQueryBuilder>();
     
    var searchQuery = queryBuilder.BuildQuery(query, control.SearchFields);
    searchQuery.IndexName = catalogue;
    searchQuery.Skip = skip;
    searchQuery.Take = take;
    searchQuery.OrderBy = null;
    searchQuery.HighlightedFields = control.HighlightedFields;
     
    var searchQueryGroup = new SearchQueryGroup();
    searchQueryGroup.Operator = QueryOperator.Or;
    var term = new SearchTerm();
    term.Field = "Categoy";
    term.Value = "CategoryName";
    searchQueryGroup.AddTerm(term);
     
    var searchQueryGroup2 = new SearchQueryGroup();
    searchQueryGroup2.Operator = QueryOperator.Or;
    var termContent = new SearchTerm();
    termContent.Field = "Content";
    termContent.Value = query + "*";
    searchQueryGroup2.AddTerm(termContent);
     
    var termTitle = new SearchTerm();
    termTitle.Field = "Title";
    termTitle.Value = query + "*";
    searchQueryGroup2.AddTerm(termTitle);
     
    searchQuery.SearchGroup = searchQueryGroup;
    searchQuery.SearchGroup.AddGroup(searchQueryGroup2);
     
    IResultSet result = service.Search(searchQuery);
    hitCount = result.HitCount;
     
    return result.SetContentLinks();


    Regards,
    Velizar Bishurov
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
  5. Paul
    Paul avatar
    13 posts
    Registered:
    29 Jul 2015
    21 Feb in reply to Velizar Bishurov
    Link to this post

    Hi Velizar

    I have tried to implement your code and still no luck. Is it possibly the way in which it is stored within the lucence index.

    I used luke.net to grab a screenshot of the field in the index, see attached image.

    Everything else above works just the categories, I am trying to search the Blogs based on category, if that helps to understand what I am trying to achieve.

    Thanks

     

     

  6. Velizar Bishurov
    Velizar Bishurov avatar
    143 posts
    Registered:
    09 Dec 2016
    24 Feb
    Link to this post
    Hello,

    I have tried this on my end and indeed searching by category does not work for blog posts as the content inbound pipe does not have the necessary logic to persist the categories as string to the index.

    I was able to achieve the desired behavior by extending the ContentInboundPipe and adding a custom field in the search index as additional field for indexing (one that the blog posts don't have). In my case in the additional fields for indexing I added the field "CustomCategories" and extended the content inbound pipe in the following way:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Telerik.OpenAccess;
    using Telerik.Sitefinity.Model;
    using Telerik.Sitefinity.Blogs.Model;
    using Telerik.Sitefinity.Publishing;
    using Telerik.Sitefinity.Publishing.Pipes;
    using Telerik.Sitefinity.Taxonomies;
    using Telerik.Sitefinity.Taxonomies.Model;
     
    namespace SitefinityWebApp
    {
        public class CustomContentInboundPipe : ContentInboundPipe
        {
            private const string BlogPostTypeName = "Telerik.Sitefinity.Blogs.Model.BlogPost";
     
            protected override void SetProperties(WrapperObject wrapperObject, Telerik.Sitefinity.Model.IContent contentItem)
            {
                base.SetProperties(wrapperObject, contentItem);
     
                if (contentItem.GetType().FullName == BlogPostTypeName)
                {
                    var blogPost = contentItem as BlogPost;
     
                    var categoriesIds = blogPost.GetValue<TrackedList<Guid>>("Category").ToList();
     
                    var taxonomyManager = TaxonomyManager.GetManager();
                    var categories = taxonomyManager.GetTaxa<HierarchicalTaxon>().Where(t => categoriesIds.Contains(t.Id)).Select(t => t.Name);
     
                    wrapperObject.SetOrAddProperty("CustomCategories", string.Join(",", categories));
                }
            }
        }
    }

    After that I registered the pipe in the Global.asax like so:

    protected void Application_Start(object sender, EventArgs e)
    {
        PublishingModule.Configured += PublishingModule_Configured;
    }
     
    private void PublishingModule_Configured(object sender, EventArgs e)
    {
        PublishingSystemFactory.UnregisterPipe(ContentInboundPipe.PipeName);
        PublishingSystemFactory.RegisterPipe(ContentInboundPipe.PipeName, typeof(CustomContentInboundPipe));
    }

    The last step is to modify the custom search result filter to search in the CustomCategories instead of the default Category field:

    var control = this.control;
    var service = Telerik.Sitefinity.Services.ServiceBus.ResolveService<ISearchService>();
    var queryBuilder = ObjectFactory.Resolve<IQueryBuilder>();
      
    var searchQuery = queryBuilder.BuildQuery(query, control.SearchFields);
    searchQuery.IndexName = catalogue;
    searchQuery.Skip = skip;
    searchQuery.Take = take;
    searchQuery.OrderBy = null;
    searchQuery.HighlightedFields = control.HighlightedFields;
      
    var searchQueryGroup = new SearchQueryGroup();
    searchQueryGroup.Operator = QueryOperator.Or;
    var term = new SearchTerm();
    term.Field = "CustomCategories";
    term.Value = "CategoryName";
    searchQueryGroup.AddTerm(term);
      
    var searchQueryGroup2 = new SearchQueryGroup();
    searchQueryGroup2.Operator = QueryOperator.Or;
    var termContent = new SearchTerm();
    termContent.Field = "Content";
    termContent.Value = query + "*";
    searchQueryGroup2.AddTerm(termContent);
      
    var termTitle = new SearchTerm();
    termTitle.Field = "Title";
    termTitle.Value = query + "*";
    searchQueryGroup2.AddTerm(termTitle);
      
    searchQuery.SearchGroup = searchQueryGroup;
    searchQuery.SearchGroup.AddGroup(searchQueryGroup2);
      
    IResultSet result = service.Search(searchQuery);
    hitCount = result.HitCount;
      
    return result.SetContentLinks();

    Regards,
    Velizar Bishurov
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
6 posts, 0 answered