给大家分享一段代码,来去解决Sitecore contact list 中不能更新contact list index问题,这个问题应该是会发生在自定义Index时会存在,问题如图:
这个问题发生在sitecore 8以上,可能sitecore自己也提供一些解决办法,但是还是存在contact list 收件人永远不更新到index中,下面我们重写下FieldMap,如下:
1. 在这个节点中的文件,打开它。 path:E:|dictionary|Config_Source\App_Config\Include\zzz_SitecoreHotfixes\Sitecore.Support.108410.config
原生代码:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <contentSearch> <!-- see issue with support ID: 462088 --> <indexConfigurations> <defaultLuceneIndexConfiguration> <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> <patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/> </fieldMap> </defaultLuceneIndexConfiguration> <customLuceneIndexConfiguration> <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> <patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/> </fieldMap> </customLuceneIndexConfiguration> </indexConfigurations> </contentSearch> </sitecore> </configuration>
修改为:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <contentSearch> <!-- see issue with support ID: 462088 --> <indexConfigurations> <defaultLuceneIndexConfiguration> <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> <!--<patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/>--> <patch:attribute name="type" value="|NameSpace|.SitecoreExtensions.Indexing.FieldMap, Dlw.ScBase.Website"/> </fieldMap> </defaultLuceneIndexConfiguration> <customLuceneIndexConfiguration> <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> <!--<patch:attribute name="type" value="Sitecore.Support.ContentSearch.FieldMap, Sitecore.Support.108410"/>--> <patch:attribute name="type" value="|NameSpace|.SitecoreExtensions.Indexing.FieldMap, Dlw.ScBase.Website"/> </fieldMap> </customLuceneIndexConfiguration> </indexConfigurations> </contentSearch> </sitecore> </configuration>
2. 添加自定义Field Map
FieldMap.cs
Path:|NameSpace|.SitecoreExtensions.Indexing.FieldMap
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sitecore.ContentSearch; using Sitecore.Data.Fields; using Sitecore.Diagnostics; namespace |your namespace|.SitecoreExtensions.Indexing { public class FieldMap : Sitecore.ContentSearch.FieldMap, IFieldMap { private readonly FieldInfo _fieldTypeNameMapInfo = typeof(Sitecore.ContentSearch.FieldMap).GetField("fieldTypeNameMap", BindingFlags.Instance | BindingFlags.NonPublic); private readonly FieldInfo _fieldNameMapInfo = typeof(Sitecore.ContentSearch.FieldMap).GetField("fieldNameMap", BindingFlags.Instance | BindingFlags.NonPublic); public new AbstractSearchFieldConfiguration GetFieldConfiguration(Type returnType) { Assert.ArgumentNotNull(returnType, "returnType"); var list = ((IEnumerable<KeyValuePair<string, AbstractSearchFieldConfiguration>>) _fieldTypeNameMapInfo.GetValue(this)).Select( arg => new {FieldType = FieldTypeManager.GetFieldType(arg.Key), arg.Value}) .Where(arg => arg.FieldType != null) .ToList(); Type lookupType; for (lookupType = returnType; lookupType != null && lookupType != typeof(object); lookupType = lookupType.BaseType) { var data = list.FirstOrDefault(arg => arg.FieldType.Type == lookupType); if (data != null) return data.Value; } var data1 = list.FirstOrDefault(arg => arg.FieldType.Type.IsAssignableFrom(lookupType)); return data1?.Value; } public new AbstractSearchFieldConfiguration GetFieldConfiguration(IIndexableDataField field, Func<AbstractSearchFieldConfiguration, bool> fieldVisitorFunc) { // make the dictionary key case insesitive, as 'field.TypeKey' is in lower case // so that typeMatch fields can be indexed correctly var fieldTypeNameMap = new Dictionary<string, AbstractSearchFieldConfiguration>( (Dictionary<string, AbstractSearchFieldConfiguration>) _fieldTypeNameMapInfo.GetValue(this), StringComparer.InvariantCultureIgnoreCase); var fieldNameMap = (Dictionary<string, AbstractSearchFieldConfiguration>) _fieldNameMapInfo.GetValue(this); Assert.ArgumentNotNull(field, "field"); AbstractSearchFieldConfiguration fieldConfiguration1; if (!string.IsNullOrEmpty(field.Name) && fieldNameMap.TryGetValue(field.Name.ToLower(), out fieldConfiguration1) && fieldVisitorFunc(fieldConfiguration1) || fieldTypeNameMap.TryGetValue(field.TypeKey, out fieldConfiguration1) && fieldVisitorFunc(fieldConfiguration1) || fieldTypeNameMap.TryGetValue(field.FieldType.FullName, out fieldConfiguration1) && fieldVisitorFunc(fieldConfiguration1)) // for generic list type, we might need to use the FiledType Fullname return fieldConfiguration1; var type = Type.GetType(field.TypeKey, false, true); if (type != null) { var fieldConfiguration2 = GetFieldConfiguration(type); if (fieldConfiguration2 != null && fieldVisitorFunc(fieldConfiguration2)) return fieldConfiguration2; } if (field.FieldType != null) { var fieldConfiguration2 = GetFieldConfiguration(field.FieldType); if (fieldConfiguration2 != null && fieldVisitorFunc(fieldConfiguration2)) return fieldConfiguration2; } return null; } AbstractSearchFieldConfiguration IFieldMap.GetFieldConfiguration(IIndexableDataField field) { return GetFieldConfiguration(field, f => true); } } }
修改后,你会发现你的contact list 是可以添加成功并且可以自动更新到自定义Index中。Good Luck