2012-01-19 93 views
1

我正在開發帶有自己的內容源的Sharepoint搜索。我有我的爬行屬性和我的託管屬性,並相應地在它們之間進行映射。 我也有動態屬性,例如用戶可以將該組屬性更改爲爬網,因此我可以在運行時從Sharepoint管理中心進行配置。 我使用下面的代碼來做到這一點:以編程方式設置CrawlProperty「包含在索引」值中(Sharepoint 2007)

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

靜態屬性增加,而安裝時,動態屬性在管理中心manualy補充道。 我正在使用相同的代碼來在管理中心安裝和設置manualy時添加屬性。

問題是Sharepoint標誌「包含在索引中」的值用於抓取屬性。在這種情況下,安裝完成後,對於所有靜態爬網屬性,此標誌的值爲TRUE(是)。否則,對於動態屬性,此標誌爲FALSE(否)。我需要一直檢查標誌「包含在索引中」。

據我所知,CrawlProperty類的IsMappedToContents屬性可以響應「包含到索引」值,但它對我不起作用!

你有什麼想法做到這一點嗎?我做錯了什麼?

在此先感謝。

回答

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在緩存實例中沒有類似的麻煩! *

相關問題