我们已将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();
}
所以我们想要优化我们的代码,或者任何人都可以帮助实现这样的场景?
答案 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;
}
}
这会将过滤工作移至索引并仅返回所需的记录。根据原始过滤器返回的数量,可以大大提高性能。