2014-10-01 47 views
1

這是我第一次使用檢查 - 到目前爲止這是工作,results變量有正確的數據,但是我想要做的就是添加searchTerm變量我想搜索所有字段目前所有返回的節點都在results使用檢查管理器搜索內容

任何想法? - 提前致謝。

var searchEngine = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"]; 
var criteria = searchEngine.CreateSearchCriteria(BooleanOperation.Or); 

IBooleanOperation query = criteria.NodeTypeAlias("level1") 
.Or().NodeTypeAlias("level2") 
.Or().NodeTypeAlias("simpleTextPage") 
.Or().NodeTypeAlias("contactPage") 
.Or().NodeTypeAlias("Locationfinder"); 

string searchTerm = "Term to Search for here"; 

var results = searchEngine.Search(query.Compile()); 

回答

3

這個問題有兩個部分。首先,你需要指定要搜索針對其字段(S):

.Or().Field("bodyText", searchTerm)

這使得你的頁面有bodyText性質的假設。您可以將附加字段添加到此搜索框中以針對其他屬性進行搜索,例如名稱,introText等

其次,如果您想跨全部字段進行搜索,則需要創建一個字段,其中包含被索引頁面中的所有文本內容。您需要:

  1. 創建一個Umbraco事件,實現IApplicationEventHandler;
  2. 添加處理用於收集節點數據:

    void OnApplicationStarted(UmbracoApplicationBase app, ApplicationContext ctx) 
    { 
        ExamineManager.Instance 
            .IndexProviderCollection["ExternalIndexer"] 
            .GatheringNodeData += OnGatheringNodeData; 
    } 
    
  3. 創建組合場:

    protected void OnGatheringNodeData(object sender, IndexingNodeDataEventArgs e) 
    { 
        var builder = new StringBuilder(); 
        foreach (var entry in e.Fields) 
        { 
         builder.AppendFormat("{0}, ", entry.Value); 
        } 
    
        e.Fields.Add("combinedText", builder.ToString()); 
    } 
    
  4. 更改搜索是.Or().Field("combinedText", searchTerm);

現在每個頁面發佈時間,將所有字段合併爲一個,這樣他們可以在你希望的方式來進行搜索。

但是,我個人建議您選擇特定的字段進行組合,因爲很少有任何需要將所有字段組合在一起。這通常表示文檔類型幾乎沒有一致性。由於類似的原因,我總是在所有文檔類型中使用通用別名,例如bodyText,introText,summaryText等。這種方式如果需要的話,我可以過濾出以「Text」結尾的字段或者將我的別名作爲靜態字符串。