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

Chr*_*uer 1 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();
Run Code Online (Sandbox Code Playgroud)

Mat*_*man 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

<field fieldName="tagsfacet">SitecoreBase72.TagsFacet,SitecoreBase72</field>
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

最后,您可以在标记字段上进行构面(一旦重建索引):

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);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)