如何使用ContentSearchManager在Sitecore标签上进行分面

时间:2014-06-04 21:35:37

标签: sitecore sitecore7

我了解如何使用ContentSearchManager搜索项目以及如何在字段上进行构面。但我无法弄清楚如何在我在Sitecore中创建的标签上进行分析。默认情况下,UI会在它们上面,但在使用ContentSearchManager的索引中。有没有人知道它?谢谢

FacetResults facets = new FacetResults();

facets = query.Where(x => x.Language.Equals(computedLanguage)
                          && (x.PageTitle.Contains(text)))
                         .FacetOn(facet => facet.tags).GetFacets();

1 个答案:

答案 0 :(得分:7)

我不确定您在哪里定义了“tags”属性,因为它不是Sitecore提供的默认SearchResultItem类中定义的属性,并且您不显示“query”的声明。 “语义”实际上是您希望用于访问项目上定义的标记的GUID的属性。

现在有两种方法可以面对这些标签。您可以只关注Semantics属性以获取基于GUID的构面。然后,您将在Sitecore中查找GUID以获取标记的名称。

FacetResults facets = new FacetResults();

facets = query.Where(x => x.Language.Equals(computedLanguage)
                      && (x.PageTitle.Contains(text)))
                     .FacetOn(facet => facet.Semantics).GetFacets();

另一种方法是在搜索索引中实际存储标记名称。这为您提供了额外的好处,允许用户轻松搜索标记名称。

将标记名称存储在索引中的计算字段如下所示:

public class TagsFacet : IComputedIndexField
{
    public object ComputeFieldValue(IIndexable indexable)
    {
        var indexableItem = indexable as SitecoreIndexableItem;

        if (indexableItem == null)
        {
            return null;
        }

        if (indexableItem.Item.Fields["__Semantics"] == null) return null;

        MultilistField tags = indexableItem.Item.Fields["__Semantics"];

        var tagNames = tags.GetItems().Select(tag => tag.Name).ToList();

        return tagNames;
    }

    public string FieldName { get; set; }
    public string ReturnType { get; set; }
}

您需要在raw:AddComputedIndexField部分中将计算字段添加到Sitecore.ContentSearch.LuceneDefaultIndexConfiguration.config(假设您使用的是Lucene):

<field fieldName="tagsfacet">SitecoreBase72.TagsFacet,SitecoreBase72</field>

然后,您需要扩展SearchResultItem类以添加新字段名称:

public class CustomSearchModel : SearchResultItem
{
    [IndexField("tagsfacet")]
    public List<String> tagsFacet { get; set; } 

}

最后,您可以在标记字段(重建索引后)上进行分析:

var searchIndex = ContentSearchManager.GetIndex("sitecore_master_index");

using (var context = searchIndex.CreateSearchContext())
{
    var myTagFacets = new FacetResults();

    myTagFacets = context.GetQueryable<CustomSearchModel>()                        
                  .FacetOn(facet => facet.tagsFacet)
                  .GetFacets();

    foreach (var facetCategories in myTagFacets.Categories)
    {
        foreach (var facet in facetCategories.Values)
        {
            Log.Info(string.Format("Facet:{0} Results:{1}",facet.Name,facet.AggregateCount),this);
        }

    }
}