2012-09-13 67 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结果' –