2016-10-31 104 views
0

我有一個名爲Terms的計算字段。該字段將Sitecore將multilist字段存儲的guid值列表讀取爲逗號分隔的字符串值。當我觸發索引重建並設置斷點時,我可以看到代碼按預期執行任務,但由於某種原因,在索引中,該值仍然以guid字符串數組形式存儲。我不知道斷開連接的位置。自定義Sitecore Solr索引計算字段返回錯誤值

檢查的Solr以及配置查詢返回的XML,我可以看到的條款場被存儲,像這樣:

<arr name="terms_t"> 
    <str>b7ba58ef002b4554808a1d423ca574d8</str> 
    <str>95680bf346d142aeb0d8f189300ea3f2</str> 
</arr> 

下面你可以看到用於填充計算字段

namespace ASHPEngine.ComputedFields 
{ 
    public class Terms : Sitecore.ContentSearch.ComputedFields.IComputedIndexField 
    { 
     public object ComputeFieldValue(IIndexable indexable) 
     { 
      Assert.ArgumentNotNull(indexable, "indexable"); 
      var scIndexable = indexable as Sitecore.ContentSearch.SitecoreIndexableItem; 
      if (scIndexable == null) 
      { 
       return false; 
      } 
      if (String.Compare(scIndexable.Item.Database.Name, "core", System.StringComparison.OrdinalIgnoreCase) == 0) 
      { 
      return false; 
     } 
     if (!scIndexable.Item.InheritsFrom(IBaseArticleConstants.TemplateName)) return String.Empty; 
     var termsField = scIndexable.GetFieldByName(INewsConstants.TermsFieldName); 
     { 
      var retval = new StringBuilder(); 
      var terms = termsField.Value.ToString().Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList(); 
      foreach (var id in terms) 
      { 
       var termItem = scIndexable.Item.Database.GetItem(new ID(id)); 
       retval.Append(termItem.Name + ", "); 
      } 

      return retval.Length > 0 ? retval.Remove(retval.Length-2, 2).ToString() : string.Empty; 
     } 
    } 

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

並且配置:

<configuration> 
<sitecore> 
    <contentSearch> 
     <configuration type="Sitecore.ContentSearch.ContentSearchConfiguration, Sitecore.ContentSearch"> 

    <indexes hint="list:AddIndex"> 
     <index id="news" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> 
     <param desc="name">$(id)</param> 
     <param desc="folder">$(id)</param> 

     <!-- This initializes index property store. Id has to be set to the index id --> 
     <param desc="propertyStore" ref="contentSearch/indexConfigurations/databasePropertyStore" param1="$(id)" /> 

     <configuration ref="contentSearch/indexConfigurations/defaultSolrIndexConfiguration"> 


      <fieldMap ref="contentSearch/indexConfigurations/defaultSolrIndexConfiguration/fieldMap"> 

      <fieldNames hint="raw:AddFieldByFieldName"> 
       <field fieldName="_uniqueid" returnType="string" /> 
       <field fieldName="article" returnType="string" /> 
       <field fieldName="author" returnType="string"/> 
       <field fieldName="author credentials" returnType="string" /> 
       <field fieldName="date" returnType="datetime" format="yyyy-MM-dd'T'HH:mm:ss'Z'" /> 
       <field fieldName="degree" returnType="string" /> 
       <field fieldName="graduation year" returnType="string" /> 
       <field fieldName="location" returnType="string" /> 
       <field fieldName="navigation title" returnType="string" /> 
       <field fieldName="page abstract" returnType="string" /> 
       <field fieldName="school" returnType="string" /> 
       <field fieldName="text" returnType="string" /> 
       <field fieldName="value" returnType="string" /> 
      </fieldNames> 
      </fieldMap> 
      <documentOptions ref="contentSearch/indexConfigurations/defaultSolrIndexConfiguration/documentOptions"> 

      <fields hint="raw:AddComputedIndexField"> 
       <field fieldName="external_link" returnType="text">mydll.ComputedFields.ExternalLink, mydll</field> 
       <field fieldName="image" returnType="text">mydll.ComputedFields.Image, mydll</field> 
       <field fieldName="terms" returnType="text">mydll.ComputedFields.Terms, mydll</field> 
       <field fieldName="url" returnType="text">mydll.ComputedFields.Url, mydll</field> 
       <field fieldName="parentname" returnType="text">mydll.ComputedFields.ParentName, mydll</field> 
      </fields> 
      </documentOptions> 

     </configuration> 

     <strategies hint="list:AddStrategy"> 
      <!-- NOTE: order of these is controls the execution order --> 
      <strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/onPublishEndAsync" /> 
     </strategies> 

     <locations hint="list:AddCrawler"> 
      <crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch"> 
      <Database>web</Database> 
      <Root>/sitecore/content</Root> 
      </crawler> 
     </locations> 

     <enableItemLanguageFallback>false</enableItemLanguageFallback> 
     <enableFieldLanguageFallback>false</enableFieldLanguageFallback> 

     </index> 
    </indexes> 
    </configuration> 
    </contentSearch> 
    </sitecore> 
</configuration> 

回答

2

我能夠通過完全刪除返回類型,像這樣以解決此問題:

<field fieldName="terms">mydll.ComputedFields.Terms, mydll</field> 
+0

這很酷:) –

1

嘗試更改計算字段的返回類型是字符串,而不是文本:

<field fieldName="terms" returnType="string">mydll.ComputedFields.Terms, mydll</field> 
+0

文本返回類型確保充分字符串被返回,而字符串返回類型會得到標記,這是不是打算 – Tyshun