索引の使用
最適化のために、おそらくリストしたい項目のインデックスを作成したいと思うでしょう。なくても構いませんが、多数の記事でパフォーマンスの問題が発生し始めます。
次のコード ブロックは、インデックスから項目を読み込む 1 つの方法の例を示しています。グーグルで検索すると、特にAdvanced Database Crawlerを使用して、これに関する多くの情報を見つけることができます。
/// <summary>
/// Searches against the Lucene index for all articles
/// </summary>
/// <returns></returns>
private List<Item> LoadArticlesWithLucene()
{
ConcurrentBag<Item> articles = new ConcurrentBag<Item>();
Index searchIndex = SearchManager.GetIndex("MyArticleIndexName");
using (IndexSearchContext context = searchIndex.CreateSearchContext())
{
//The wildcard search allows us to pull back all items from the index
var query = new WildcardQuery(new Term(Constants.LuceneFields.Name, "*"));
SearchHits hits = context.Search(query);
//Go through the results
SearchResultCollection results = hits.FetchResults(0, hits.Length);
Parallel.ForEach(results, result =>
{
//This is done in a foreach in case you want to add any processing or checking before adding to your collection
Item searchItem = result.GetObject<Item>();
articles.Add(searchItem);
});
}
return articles.ToList();
}
引き続きインデックスを作成する必要があります。高度なデータベース クローラー モジュールを使用している場合は、次のような構成を Sitecore インスタンスに追加するだけです。
<search>
<configuration>
<indexes>
<index id="MyArticleIndexName" type="Sitecore.Search.Index, Sitecore.Kernel">
<param desc="name">$(id)</param>
<param desc="folder">__news</param>
<Analyzer ref="search/analyzer" />
<locations hint="list:AddCrawler">
<master type="scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler,scSearchContrib.Crawler">
<Database>master</Database>
<Root>/sitecore/content</Root>
<IndexAllFields>true</IndexAllFields>
<include hint="list:IncludeTemplate">
<article>{3DD181B0-0F39-4E7A-8C94-DFA129DE6C81}</article> <!-- Replace the GUID here with yours -->
</include>
<fieldTypes hint="raw:AddFieldTypes">
<!-- Multilist based fields need to be tokenized to support search of multiple values -->
<fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
</fieldTypes>
</master>
</locations>
</index>
</indexes>
</configuration>
</search>
インデックスなしで Sitecore からプルする
インデックスなしで Sitecore から取得する場合、特定のテンプレート ID または名前 (記事テンプレート) を持つすべての子孫を検索する必要があります。これを行うには複数の方法がありますが、次のような拡張機能を使用できます。
/// <summary>
/// Returns every item below the current item which has the specified template
/// </summary>
/// <param name="item"></param>
/// <param name="templateName">Template of items to return</param>
/// <returns></returns>
public static List<Item> GetAllDescendants(this Item item, string templateName)
{
return new List<Item>(Context.Database.SelectItems(item.Paths.LongID + "//*[@@templatename='" + templateName + "']"));
}