2013-10-03 2 views
3

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(); 
     } 
    } 
+2

Запросы, выполненные по индексу Lucene, который содержит менее 10 000 записей, не должны быть высокими потребляющими CPU. Можете ли вы опубликовать код наиболее распространенных запросов и как вы извлекаете элемент из результатов запроса? –

+0

+1 для @MarasMusielak. Но в качестве стороннего я могу также добавить плагин для ElasticSearch: http: //blog.navigationarts.com/an-alternative-search-solution-elasticsearch/ –

+0

Вам нужно отладить ваш код и посмотреть, есть ли узкое место, как сказал @Maras Musielak, 10 000 записей не должны быть высокими потребляющими CPU вообще –

ответ

2

Вы должны искать в реализации Solr для поиска. Несмотря на то, что Solr не является экспертом по этой теме, Solr основано на Lucene (упрощает переход) и запускает центральный сервер или серверы, имея дело со всеми вашими требованиями к поиску.

Solr официально не поддерживается в версиях до Sitecore 7 - но я работал над несколькими решениями Sitecore 6, которые использовали Solr.

Эта статья должна дать вам свинцовый старт: How to implement Solr into Sitecore

Насколько промышленные процессы идут с Sitecore, Solr является решением этой конкретной проблемы. Однако, в зависимости от вашей реализации решения, это может занять некоторое время, чтобы встать и уйти.

+0

Также см. [Использование Solr или Lucene] (https://doc.sitecore.net/sitecore_experience_platform/setting_up__maintaining/search_and_indexing/indexing/using_solr_or_lucene) – Liam

0

Вы можете посмотреть на www.alpha-solutions.dk/sitecore-search-solution для подхода Solr on Sitecore 6. Примечание: Я присоединен к Alpha Solutions

0

Ваш индекс невелик, я знаю, что есть рекомендации, которые вы создаете для всего решения, однако я рекомендую что-то, что я сделал в прошлом, который хорошо работал для меня и не будет требуется, чтобы вы предоставили другой сервер или установили другой инструмент для индексирования, например Elastic или SOLR.

Во-первых, хранить поля в индексе, который вы фасета, как показано ниже (либо в конфигурации или с помощью настраиваемого сканеру):

  • _group
  • _path
  • _creator
  • Производитель
  • Размер
  • Год
  • ...[другие поля]

Создать класс, представляющий в результате

public class MyThing 
    { 
     public string Manufacturer { get; set; } 
     public string Size { get; set; } 
     public int Year { get; set; } 
     public MyThing(Document doc) 
     { 
      Manufacturer = doc.GetField("Manufacturer").Value; 
      Size = doc.GetField("Size").Value; 
      Year = int.Parse(doc.GetField("Year").Value); 
     } 
    } 

Тогда ваши главные хиты результат поиска, создать экземпляр легкий ПОКО, и делают отсчеты от этого. Voila, 1 запрос!

int countForSomething = results.Count (result => result.Size == "XL");

ПРИМЕЧАНИЕ: Я как бы написал этот код с головы, но вы поняли эту идею. Я использовал этот процесс для индексов в Lucene до 700K +, результаты Sitecore без особых проблем. Удачи сэр!

+0

Я думаю, что фильтры Lucene могут достичь того же, что и в пользовательском коде: http: //www.javaranch.com/journal/2009/02/filtering-a-lucene-search.html – ravinsp

+0

Ничего себе круто, я раньше не занимался этим, но сейчас. –

0

Ах! Просто рассмотрел вопрос о факсимильном поиске и использовании ЦП. Это некоторая пограничная черная магия и некоторые действительно творческие кэширования.

Мы нашли способ реализовать граненый запрос Solr в Lucene, а мальчик-мальчик - результаты потрясающе быстро.

Короткая версия:

  • Построить статический класс, который держит на словарь. Ключ: уникальное представление отдельного фильтра, Value: BitArray, созданный объектом Lucene QueryFilter.

    var queryFilter = new QueryFilter (filterBooleanQuery); var bits = queryFilter.Bits (indexReader); result [filter.ID.ToString()] = bits

  • Постройте этот словарь периодически асинхронно в фоновом режиме. Мой индекс около 80 тыс. Документов занимал около 15 секунд, но этого достаточно, чтобы заставить многих пользователей сердиться, поэтому делать это неблокируемым образом имеет решающее значение.

  • Запросите этот словарь, используя побитовую логику, чтобы найти полученный BitArray, представляющий интересующие вас образы.

    вар комбо = facetDictionary [thisFilter.ID.ToString()] .И (facetDictionary [selectedFilter.ID.ToString()]);

Long Version: http://www.devatwork.nl/articles/lucenenet/faceted-search-and-drill-down-lucenenet/

Теперь наша реализация была только, чтобы получить мощность этих наборов результатов, но теоретически вы могли бы использовать эти битовые массивы, чтобы получить фактические документы из индекса, а также.

Удачи вам!

0

Модернизация до сидения 7 даст вам грани из коробки. Аннотация в хорошем LINQ API, который позволяет переключаться с Lucene и SOLR (другие, такие как ElasticSearch) ...

Смежные вопросы