Sitecore.NET 6.6.0 (リビジョン 130404)
私たちの運用 Web サイトは非常に検索が多く、Lucene インデックスは 1 日を通して頻繁にクエリされます。これは、Lucene クエリの処理にかなりの量の CPU パワーが費やされていることになります。Lucene インデックスとクエリを別のマシンにオフロードする業界慣行はありますか? または、Lucene クエリのパフォーマンスを向上させるために使用できるハードウェア メカニズムはありますか?
(最も使用されている Lucene インデックスには 10,000 未満のエントリが含まれています)
更新 (詳細):
私たちのインデックスには 10,000 未満しか含まれていませんが、CPU 使用率は、並行して実行される Lucene クエリの数が多いために発生する可能性がありますか? 非常に複雑なファセット検索があります。最初に、ユーザーがさまざまな検索条件を試すと、すべての検索オプションとともに結果カウントの内訳が表示されました (各検索要求で 50 ~ 60 カウントのクエリが発生しました)。これにより、トラフィックが多いときに CPU 使用率が 90 ~ 95% に達しました。カウントを削除すると、CPU は約 20 ~ 30% で安定しました。
クエリに使用する 2 つの方法を次に示します。
public static Document[] GetLuceneDocuments(ACIndex acIndex, Query query, Sort sort = null, int maxResults = 999, bool trackScores = false, bool fillFields = true)
{
Index index = SearchManager.GetIndex(GetIndexName(acIndex));
if (sort == null)
{
sort = new Sort(new SortField(null, SortField.SCORE));
}
using (IndexSearchContext searchContext = index.CreateSearchContext())
{
Lucene.Net.Search.IndexSearcher searcher = searchContext.Searcher;
TopFieldCollector collector = TopFieldCollector.create(sort, maxResults, fillFields, trackScores, false, false);
searcher.Search(query, collector);
TopDocs topdocs = collector.TopDocs();
Document[] documents = new Document[topdocs.ScoreDocs.Length];
for (int i = 0; i < topdocs.ScoreDocs.Length; i++)
{
documents[i] = searcher.Doc(topdocs.ScoreDocs[i].doc);
}
return documents;
}
}
public static int GetSearchResultCount(ACIndex acIndex, Query query)
{
Index index = SearchManager.GetIndex(GetIndexName(acIndex));
using (IndexSearchContext searchContext = index.CreateSearchContext())
{
Lucene.Net.Search.IndexSearcher searcher = searchContext.Searcher;
TopScoreDocCollector collector = TopScoreDocCollector.create(1, false);
searcher.Search(query, collector);
return collector.GetTotalHits();
}
}