2012-09-13 65 views
0

我構建了一個函數,用於傳遞想要搜索的國家/地區字符串以及想要從搜索結果中獲取的文章數量。過濾SearchResultCollection中的項目

但是,當搜索即將從Sitecore的內容項背,我不希望顯示其在其標題場的首發星號(*)的項目。下面是函數名稱:

protected IEnumerable<Item> ShowHomePageNews(int numOfArticles, string stringofCountries) 
    { 
     List<Item> items = new List<Item>(); 
     Sitecore.Search.Index indx = SearchManager.GetIndex("my_index_name"); 
     using (IndexSearchContext searchContext = indx.CreateSearchContext()) 
     { 
      CombinedQuery query = new CombinedQuery(); 
      QueryBase catQuery = new FieldQuery("countries", stringofCountries); //FieldName, FieldValue. 
      SearchHits results = searchContext.Search(catQuery); //Searching the content items by fields. 
      SearchResultCollection result = results.FetchResults(0, numOfArticles); 
      foreach (SearchResult i in result) 
      { 
       Lucene.Net.Documents.Field url = i.Document.GetField("_url"); 
       Sitecore.Data.ItemUri itemUri = new Sitecore.Data.ItemUri(url.StringValue()); 
       Sitecore.Data.Items.Item item = Sitecore.Context.Database.GetItem(itemUri.ToDataUri()); 
       items.Add(item); 
      } 
     } 

     return items; 
    } 

而且我呼籲我的pageLoad的這個功能:

rptHomePageNews.DataSource = ShowHomePageNews(4, 「USA」);

這是我的標記:

<asp:Panel ID="HomePageNews" runat="server"> 
<asp:Repeater ID="rptHomePageNews" runat="server"> 
    <ItemTemplate> 
    <li> 
     <%--<sc:FieldRenderer ID="FieldRenderer1" FieldName="Date" runat="server" Item="<%# Container.DataItem as Sitecore.Data.Items.Item %>" />--%> 
     <a href="<%# Sitecore.Links.LinkManager.GetItemUrl(Container.DataItem as Sitecore.Data.Items.Item) %>"> 
      <sc:FieldRenderer ID="FieldRenderer2" FieldName="Title" runat="server" Item="<%# Container.DataItem as Sitecore.Data.Items.Item %>" /> 
     </a> 
    </li> 
    </ItemTemplate> 
</asp:Repeater> 

我應該讓我的ShowHomePageNews功能什麼樣的變化?

+0

您在搜索做過濾感興趣,或者你願意使用搜索後LINQ查詢過濾? –

+0

是的!我願意這樣做。 –

+0

我的'結果'變量在這裏是0。我做錯了什麼? –

回答

1

一種方法是做使​​用LINQ查詢,這樣的事情後過濾,:

string myTitleField = "My Title Field"; 
List<Item> results = items.Where(x => x.Fields[myTitleField].Value.Contains("*") == false).ToList(); 

這樣做效率不高,因爲您需要在開始過濾之前加載所有項目。如果效率不是問題,那麼這至少提供了一種簡單的過濾方法。

但是,我的建議是在您的索引中添加一個字段,並使用您可以過濾的值(例如「TitleContainsAsterisk」)標記該記錄。然後,您可以更改查詢以篩選出在該字段中具有「真」或「1」的結果。

編輯(用於高級數據庫爬行器) 添加動態字段的配置和代碼示例。 注意我還沒有編譯或運行它,我是僞編碼關閉現有的代碼,我有:

<dynamicFields hint="raw:AddDynamicFields"> 
    <dynamicField type="MyNameSpace.TitleContainsAsterisk,MyBinary" 
     name="TitleContainsAsterisk" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
</dynamicFields> 

/// <summary> 
/// Field Configuration (for the indexer) to index the if there is an asterisk in the title 
/// </summary> 
public class TitleContainsAsterisk: BaseDynamicField { 
    public override string ResolveValue(Item item) { 
     string myTitleField = "My Title Field"; 
     bool containsAsterisk = item.Fields[myTitleField].Value.Contains("*"); 
     return containsAsterisk ? "1" : "0"; 
    } 
} 
+0

謝謝Jay,你有沒有在Sitecore 6.5中實現索引? –

+0

我沒有親自編寫6.5索引的代碼或配置,但是在6.4中已經這樣做了。但是,我的團隊一直在使用6.5索引編制一段時間。 –

+0

很高興聽到這一點。謝謝! –

1

如果你樂於使用LINQ中,你可以像這樣的東西替換foreach循環:

這裏
var db = Sitecore.Context.Database; 

items = result 
     .Where(r => !r.Title.StartsWith("*")) 
     .Select(r => db.GetItem(new Sitecore.Data.ItemUri(r.Url).ToDataUri())) 
     .ToList(); 
+0

我在這段代碼中使用SearchResult的地方? –

+0

變量'result'在你的例子中引用相同的變量:'SearchResultCollection結果' –