0

我构建了一个函数,我在其中传递了我想要搜索的国家字符串以及我想从搜索结果中获取的文章数量。

但是,当搜索从 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 函数中进行哪些更改?

4

2 回答 2

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";
    }
}
于 2012-09-13T18:05:42.377 回答
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();
于 2012-09-13T15:54:55.050 回答