2013-08-23 100 views
1

我們使用的Umbraco具有內置於Lucene上的內置搜索系統。如何使用Lucene查詢CSV字段

網站上的每個文檔都包含一個標籤列表,這些標籤由Luence作爲包含CSV格式標籤的單個字段進行索引和保存。

例如:

Red,Green,Blue 

然而,當我們通過搜索一把umbraco對這個領域(也使用Luke)我們沒有得到正確的行爲。

正在搜索「紅色」作品,但搜索「綠色」或「藍色」沒有。

從我對Lucene的理解來看,這全部歸結爲分析器不瞭解CSV格式。分析器需要使用逗號進行分詞,以分解爲令牌。

但是,我在如何實現這一點的損失。

這似乎是一個普遍的問題,所以我必須錯過一些非常明顯的東西。

+0

您是否在使用檢查搜索索引? –

+0

是的 - 但正如我所說,我已經通過檢查和Luke –

回答

0

我最近剛剛建立了一個Umbraco 6.1.3網站,完全是這樣。標籤被添加到以逗號分隔格式編制索引的文檔類型的「標籤」屬性。

該Umbraco網站有所有默認的索引設置,所以沒有任何修改。

當我在盧克打開「外部」內容索引我可以看到「標籤」字段被索引,存儲和記號化(除其他事項外),並具有值存儲爲預期:

enter image description here

如果我在Luke中使用tags:loremtags:ipsum進行搜索,則兩者都會返回正確的結果。

如果您的標籤字段沒有被標記,那麼我會檢查您使用的分析儀。 Lucene.Net.Analysis.Standard.StandardAnalyzer是可取的,因爲它會考慮到這一點。我很確定WhitespaceAnalyzer不會。

或者,您可以攔截「索引」事件中的Umbraco文檔,創建一個名爲「tags_mod」的新Lucene字段並添加tags.Replace(",", ", ")。這樣他們應該被正確索引。你當然必須搜索「tags_mod」而不是「tags」。這感覺有點冒險,但完全有效。將文本內容組合到單個可索引字段中是一種很好的方法,例如,如果幾個字段都有相同的偏差,並且不需要索引,則將它們分別標記並存儲。

0

你是正確的,CSV不適用於Lucene。正如在Umbraco forum上討論的那樣,您需要將函數綁定到GatheringNodeData檢查事件,該事件允許您執行自定義索引。

您可以使用此功能以空格而不是逗號分隔CSV字段,將此數據作爲新索引字段插入並將其包含在examineIndex的<IndexUserFields>部分。配置

public class ExamineEvents : IApplicationStartupHandler 
{ 
    public ExamineEvents() 
    { 
     ExamineManager.Instance.IndexProviderCollection[INDEX_NAME].GatheringNodeData 
     += ExamineEventsGatheringNodeData; 
    } 

    void ExamineEventsGatheringNodeData(object sender, IndexingNodeDataEventArgs e) 
    { 
     if (e.IndexType == IndexTypes.Content) 
     { 
      var node = new Node(e.NodeId);     
      IndexCsv(e, node);     
     } 
    } 

    private void IndexCsv(IndexingNodeDataEventArgs e, Node node) 
    { 
     if (node.NodeTypeAlias == "CsvPropertyDocType" && 
      !string.isNullOrEmpty(node.GetPropertyValue("CsvProperty"))) 
     { 
      e.Fields.Add("CsvFieldSearchable", node.GetPropertyValue("CsvProperty").Replace(","," ")); 
     } 
    } 
} 

其中CsvProperty是CSV屬性的名稱,CsvPropertyDocType是文檔類型方含屬性的名稱,INDEX_NAME是你的檢查索引名。

+0

做了搜索不知道有關Lucene不能分析CSV格式,我的例子表明它可以 - 或至少檢查的實現可以。這取決於使用的分析儀。 – Digbyswift