2013-06-25 47 views
2

我想包含一個相關文檔(Sitecore--具體來說,Lucene文檔是Item),這樣當Lucene索引爲A類型的項目創建文檔時,也包括來自另一個項目B的所有屬性。以編程方式擴展Lucene文檔和其他字段

最終結果是,當用戶搜索在項目B上找到的數據時,用戶在項目A上得到一個命中。本質上,我想我試圖以編程方式「擴展」Lucene文檔。

這是我的代碼到目前爲止。我擴展了索引器類,並重寫了一個方法,我在其中添加項目B到項目A(上下文文檔)的字段。在我的web.config中,我用自定義的數據庫爬蟲類添加了一個特定的搜索索引(用於調試速度)。

public class DatabaseCrawlerExtension : Sitecore.Search.Crawlers.DatabaseCrawler 
{ 
    protected override void AddAllFields(Lucene.Net.Documents.Document document, Sitecore.Data.Items.Item item, bool versionSpecific) 
    { 
     base.AddAllFields(document, item, versionSpecific); 

     string fieldName; 
     if (/* item is of template A */) 
     { 
      var targetItems = /* get items based on a property */; 
      foreach (var additionalIndexItem in targetItems) 
      { 
       foreach (var fieldKey in additionalIndexItem.Fields 
        .Select(f => f.Key) 
        .Where(fk => !fk.StartsWith("_"))) 
       { 
        document.Add(base.CreateValueField(fieldKey, additionalIndexItem[fieldKey])); 
       } 
      } 
     } 
    } 
} 

我已經調試此代碼,可以看到它擊中排隊叫號document.Add,與被添加的正確的數據。我嘗試不同的方法是先調用base方法,然後嘗試使用方法AddSpecialFields而不是AddAllFields。這並沒有在索引中產生任何額外的數據。

要調試/查看索引,我一直在重建索引(在Sitecore中)並查看最終結果,以及使用名爲Luke的工具直接查看生成的索引文件。

回答

1

這只是一個猜測,但不是使用base.CreateValueField(),您可以嘗試自己創建一個新的Lucene.Net.Documents.Field並將其添加到文檔中。如果要查看Luke索引中的值,請務必在字段上將Store設置爲Field.Store.YES,否則,該值將被索引,但不會存儲在索引中。

+0

感謝盧克和'Field.Store'點 - 工具然而相當複雜的使用,所以我傾向於使用它只是爲了確認最終結果 – Simeon

+0

我將嘗試使用上'Field'構造 – Simeon

1

CreateValueField是在文檔中創建一個索引未存儲字段(每sitecore documentation)的便捷方法。 。我懷疑這是你遇到的問題。正如人們所期望的那樣,Luke在從索引中提取時不會顯示僅索引字段。

這聽起來像它是正確的使用行爲,如上所述。您希望在項目B中搜索值,並返回項目A中的值,因此項目B中的值不需要從搜索中返回。嘗試測試對項目B中的值的搜索是否有效,而不僅僅是查看存儲的字段。您也可以嘗試按"Reconstruct & Edit",這可能會生成一個包含未存儲字段值的文檔。

另一個可能的問題是您嘗試從項目B中包含的數據類型。CreateValueField嘗試索引值,例如數字或日期。這些處理方式是不同的,我真的不知道它會如何處理文本值。如果您嘗試包含文本值,則應該使用CreateTextField

0

以下是我的自定義媒體抓取工具的代碼。它適用於我,並將自定義值添加到索引lucene。它不會執行base.AddAllFields,但這不應該是您的代碼無法工作的原因。

public class MyMediaCrawler : Sitecore.Search.Crawlers.DatabaseCrawler 
{ 
    protected override void AddAllFields(Document document, Item item, bool versionSpecific) 
    { 
     MediaItem mediaItem = item; 

     document.Add(CreateField(Sitecore.Search.BuiltinFields.Content, item.DisplayName, true, 1f)); 
     document.Add(CreateField("anc", String.Join(" ", item.Axes.GetAncestors().Select(a => a.ID.ToShortID())), true, 1f)); 
     document.Add(CreateField("filename", String.IsNullOrEmpty(mediaItem.Title) ? item.DisplayName : mediaItem.Title, false, 1f)); 
    } 
} 
相關問題