Sitecore.NET 6.6.0 (ред 130404.)Sitecore - балансировки нагрузки Lucene запросов
Наш сайт находится в очень большой поиск тяжелых и наши Lucene индексы опрашиваются сильно в течение всего дня. Это составляет значительную часть мощности процессора, затрачиваемой на обработку запросов Lucene. Существуют ли отраслевые методы для разгрузки индексов Lucene и запросов на другую машину? или есть ли какие-либо аппаратные механизмы, которые можно использовать для повышения производительности запросов Lucene?
(Наш наиболее часто используемый индекс Lucene содержит менее 10000 записей)
Update (подробнее):
Хотя наш индекс содержит менее 10000, может использование ЦП быть вызвано большим количеством Люценские запросы, которые выполняются параллельно? У нас очень сложный фасетный поиск. Первоначально, когда пользователи опробовали различные критерии поиска, мы отображали результаты с разбивкой по итоговым параметрам вместе со всеми параметрами поиска (в результате с запросами на поиск было запрошено 50-60 запросов). Это привело к тому, что использование ЦП достигало 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();
}
}
Запросы, выполненные по индексу Lucene, который содержит менее 10 000 записей, не должны быть высокими потребляющими CPU. Можете ли вы опубликовать код наиболее распространенных запросов и как вы извлекаете элемент из результатов запроса? –
+1 для @MarasMusielak. Но в качестве стороннего я могу также добавить плагин для ElasticSearch: http: //blog.navigationarts.com/an-alternative-search-solution-elasticsearch/ –
Вам нужно отладить ваш код и посмотреть, есть ли узкое место, как сказал @Maras Musielak, 10 000 записей не должны быть высокими потребляющими CPU вообще –