Sitecore与Solr搜索和自动提示

时间:2016-09-23 05:13:16

标签: jquery solr sitecore sitecore-mvc sitecore8.1

我们已将Solr Search应用于Sitecore 8.1和MVC,我们正在努力解决搜索文本框中的自动完成/自动建议功能。

问题: 结果并没有像我们预期的那样快。这花费了太多时间。

我们做了什么:

一个。我们在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();
    }

所以我们想要优化我们的代码,或者任何人都可以帮助实现这样的场景?

1 个答案:

答案 0 :(得分: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; 
    } 
}

这会将过滤工作移至索引并仅返回所需的记录。根据原始过滤器返回的数量,可以大大提高性能。