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を使用することに満足している場合は、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 に答える
1

ここでの1つのアプローチは、次のようなLINQクエリを使用してポストフィルタリングを実行することです。

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

フィルタリングを開始する前にすべてのアイテムをロードする必要があるため、これは効率的ではありません。効率が問題にならない場合、これは少なくともフィルタリングする簡単な方法を提供します。

ただし、私の提案は、インデックスにフィールドを追加し、フィルタリングできる値( "TitleContainsAsterisk"など)でレコードにフラグを立てることです。次に、クエリを変更して、そのフィールドに「true」または「1」が含まれる結果を除外できます。

EDIT(Advanced Database Crawlerの場合)動的フィールドを追加するための構成とコード例。私はこれをコンパイルまたは実行していないことに注意してください、私は私が持っている既存のコードから疑似コーディングしています:

<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 に答える