我正在使用自己的内容源开发Sharepoint搜索。我有我的抓取属性和托管属性以及相应的映射。 我也有动态属性,例如用户可以更改要爬网的属性集,因此我在运行时从Sharepoint管理中心创建它。 我正在使用以下代码来执行此操作:
private static void CreateProperty(string propertyName, Category category, ManagedPropertyCollection managedProperties)
{
var crawledProperty = category.CreateCrawledProperty(propertyName, false, Constants.CategoryId, 31);
crawledProperty.IsMappedToContents = true;
SetMapping(crawledProperty, managedProperties);
crawledProperty.Update();
}
private static void SetMapping(CrawledProperty cProp, ManagedPropertyCollection managedProperties)
{
ManagedProperty mProp = managedProperties.Create(cProp.Name, ManagedDataType.Text);
mProp.EnabledForScoping = true;
Mapping newMapping = new Mapping(cProp.Propset, cProp.Name, cProp.VariantType, mProp.PID);
MappingCollection mappings = mProp.GetMappings();
mappings.Add(newMapping);
mProp.SetMappings(mappings);
mProp.EnabledForScoping = true;
}
静态属性在安装时添加,动态属性在管理中心添加。 我在管理中心安装和设置时使用相同的代码添加属性。
问题是抓取属性的Sharepoint标志“包含在索引中”的值。在这种情况下,安装完成后,对于所有静态爬网属性,此标志的值为TRUE(是)。否则,对于动态属性,此标志为FALSE(否)。我需要一直检查标志“包含在索引中”。
据我所知,CrawlProperty类的属性IsMappedToContents负责“包含到索引”值,但它对我不起作用!
你有任何想法吗?我做错了什么?
提前致谢。
答案 0 :(得分:2)
我发现了这个问题。这是分享愚蠢的伎俩! 主要的麻烦是sharepoint具有对象实例的缓存。 让我们看看,我编写了示例如何以编程方式更新爬网属性IsMappedToContents属性值。
foreach (CrawledProperty crawledProperty in category.GetAllCrawledProperties())
{
crawledProperty.IsMappedToContents = true;
crawledProperty.Update();
}
你必须使用crawledProperty变量的新实例!如果你写这样的东西:
CrawledProperty crawledProperty = category.CreateCrawledProperty(...);
crawledProperty.IsMappedToContents = true;
crawledProperty.Update();
你失败了!
因此,始终使用category.GetAllCrawledProperties()已爬网属性的实例来更改此属性。
PS:IsMappedToContents负责Sharepoint中的“包含在索引中”复选框。 * PS2:这个东西适用于Sharepoint 2007,因为我知道Sharepoint 2010在缓存实例方面没有类似的麻烦! *