2016-09-23 5 views
0

Мы применили Solr Search с Sitecore 8.1 и MVC, где мы боремся с функциями Auto complete/Auto Suggestion в текстовом поле поиска.Sitecore with Solr search and Autosuggestion

Вопрос: Результаты не отображаются так быстро, как мы ожидаем. это занимает слишком много времени.

Что мы сделали:

A. Мы создали Ajax вызова на cshtml странице, как показано ниже.

$(document).ready(function() { 
    $("#SearchQuery").autocomplete({ 
     autoFocus: true, 
     minLength: 3, 
     source: function (request, response) { 
      $.ajax({ 
       type: "POST", 
       url: "@(Url.Action("SearchSuggestion", "SearchService"))", 
       dataType: "json", 
       data: { enteredText: request.term }, 
       success: function (data) { 
        debugger; 
        response(data); 
       } 
      }) 
     }, 
     messages: { 
      noResults: "", results: "" 
     } 
    }); 
}) 

B. Это наш контроллер.

[HttpPost] 
    public JsonResult SearchSuggestion(string enteredText, int? page) 
    { 
     var result = service.GetSearchAutoData(enteredText).ToList(); 
     return Json(result, JsonRequestBehavior.AllowGet); 
    } 

    public List<Search> GetSearchAutoData(string searchText) 
    { 
     var searchresult = GetSearchAutoSuggetions(searchText) 
      .Take(10) 
      .Select(x => new Search 
       { 
        title = x.Document.GetItem().Name, 
        description = x.Document.GetItem().Fields["Description"].ToString(), 
        extenstion = x.Document["GetMediaExtension"], 
        url = (x.Document.GetItem().Paths.IsMediaItem) ? Sitecore.Resources.Media.MediaManager.GetMediaUrl(new MediaItem(x.Document.GetItem())) : x.Document.GetItem().Paths.ContentPath       
       }) 
       .Where(x => (x.extenstion.ToLower() != "jpeg" && x.extenstion.ToLower() != "jpg" && x.extenstion.ToLower() != "png")); 
     return searchresult.ToList(); 
    } 

Итак, мы хотим оптимизировать наш код, или кто-нибудь может помочь реализовать такой сценарий?

+0

Могло быть много причин - во-первых, что делает эта функция? 'GetSearchAutoSuggetions' –

+0

Эта функция помогает мне получить результат поиска с помощью API поиска Sitecore Content. Код ниже –

+0

Хорошо - но это, вероятно, код, который будет иметь шею бутылки в исполнении. Сначала он возвращает «IQueryable»? –

ответ

1

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

Вы должны либо изменить эту функцию, чтобы вернуть IQueryable<SearchResult>, либо сделать фильтрацию и .Take(10) внутри этого метода.

Некоторые потенциальные изменения:

public SearchResults<SearchHelper> GetSearchAutoSuggetions(string searchtext, int maxResults) 
{ 
    using (searchContext) 
    { 
     var query = searchContext.GetQueryable<SearchHelper>() 
      .OrderByDescending‌​(i => i.BoostingValue) 
      .Where(i => (
       i.MetaTitle.Contains(searchtext) 
       || 
       i.Name.Contains(searchtext) 
       ) 
       && !i.IsStandardvalue 
       && i.ShowInSearchResult == true 
       && i.extenstion.ToLower() != "jpeg" 
       && i.extenstion.ToLower() != "jpg" 
       && i.extenstion.ToLower() != "png" 
      ).Take(maxResults); 


     var result = query.GetResults(); 
     return result; 
    } 
} 

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

+0

Спасибо за ввод. Попробуй. –

+0

Еще одна вещь, Когда я нажимаю клавишу ввода в текстовом поле поиска, он перенаправляется на страницу результатов поиска. В это время он занимает слишком много времени, то есть примерно 8-9 секунд. Будет ли этот подход помогать в этом? я думаю, мне не нужно извлекать .take (10) за это время Мне нужно взять все записи. Правильно ? –

+0

Вы должны открыть для этого новый вопрос - вы можете получить дополнительную поддержку для этого на http://sitecorechat.slack.com/ –