2016-09-23 4 views
0

Sitecore 8.1 및 MVC를 사용하여 Solr 검색을 적용했습니다. 여기서는 검색 텍스트 상자에 자동 완성/자동 제안 기능으로 어려움을 겪고 있습니다.Solr 검색 및 자동 스로 잉이 포함 된 Sitecore

문제 : 결과가 예상보다 빨리 나타나지 않습니다. 너무 많은 시간이 걸립니다.

은 한 우리가 무엇을 :

A. 우리는 아래와 같이 cshtml 페이지에서 Ajax 호출을 만들었습니다.

$(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

이 함수는 Sitecore Content search API를 사용하여 검색 결과를 얻는 데 도움이됩니다. 아래 코드는 –

+0

입니다.하지만 성능면에서 병목이 될 코드 일 것입니다. 먼저'IQueryable'을 반환합니까? –

답변

1

가장 먼저 볼 수있는 것은 GetSearchAutoSuggestionsSearchResult을 반환하고 그 결과를 필터링하고 메모리에서 트리밍하는 것입니다. 즉, 대량의 데이터가 인덱스에서 반환되고 모든 비 직렬화가 잠재적으로 큰 데이터 세트에서 수행됩니다.

해당 함수를 변경하여 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

한 가지 더 검색 텍스트 상자에 Enter 키를 누르면 검색 결과 페이지로 리디렉션됩니다. 그 시간에 너무 많은 시간, 즉 약 8-9 초가 걸립니다. 이 방법이 도움이됩니까? 나는 그 시간 동안 take (10)을 가져올 필요가 없다고 생각합니다. 모든 레코드를 가져와야합니다. 권리 ? –

+0

새 질문을 열어야합니다. http://sitecorechat.slack.com/ –