Sitecore.NET 6.6.0(修订版 130404)
我们的生产网站搜索量很大,我们的 Lucene 索引全天都被大量查询。这相当于在 Lucene 查询处理上花费了大量的 CPU 能力。是否有行业惯例将 Lucene 索引和查询卸载到不同的机器上?或者是否有任何硬件机制可用于提高 Lucene 查询性能?
(我们最常用的 Lucene 索引包含少于 10,000 个条目)
更新(更多信息):
尽管我们的索引包含少于 10,000 个,但 CPU 使用率是否是由并行执行的大量 Lucene 查询引起的?我们有一个非常复杂的多面搜索。最初,当用户尝试各种搜索条件时,我们会在所有搜索选项旁边显示结果计数细分(每个搜索请求会产生 50-60 个计数查询)。这导致在高流量期间 CPU 使用率达到 90-95%。当我们删除计数时,CPU 稳定在 20-30% 左右。
以下是我们用于查询的两种方法:
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();
}
}