Sitecore8.2 .net Solr搜索实现
基于Sitecore8.2&Solr5.1.0实现搜索功能,实现前台输入关键词返回相应结果。
Lucene 是 Sitecore CMS 中用于索引和搜索网站内容的开源搜索引擎。Sitecore 为拥有自己 API 的 Lucene 引擎实现了一个包装器。原 API (Lucene.Net) 和 Sitecore API (搜索。) 希望扩展索引和搜索功能的开发人员都可以访问。
在此之前,需要做一些准备工作,可访问另一篇文章进行安装Solr点击跳转至安装步骤
var searchIndex = ContentSearchManager.GetIndex("sitecore_web_index"); // 获取搜索索引 var values = NoHTML(val);//这里是去除了搜索关键词带的一些特殊字符,方法NoHTML(str) var searchPredicate = GetSearchPredicate(values); // 构建搜索谓词 using (var searchContext = searchIndex.CreateSearchContext()) //获取搜索索引的上下文
{ var searchResults = searchContext.GetQueryable<SearchModel>().Where(searchPredicate); // 在索引中搜索与谓词匹配的项目 // 获得所有的结果 var fullResults = searchResults.GetResults(); Console.WriteLine(fullResults); foreach (var hit in fullResults.Hits) { //这里我加了一个判断,只获取某一结点下的全部结果 if (hit.Document._fullpath.Contains("newsindex")) { myResults.Results.Add(new SearchResult { news_title = hit.Document.bigtitle_t, news_detail = hit.Document.details_t, news_date = hit.Document.date_t, _fullpath = hit.Document._fullpath, }); } } }
下面的GetSearchPredicate()
public static Expression<Func<SearchModel, bool>> GetSearchPredicate(string searchTerm) { //var predicate = PredicateBuilder.True<SearchModel>(); // Items which meet the predicate var predicate = PredicateBuilder.New<SearchModel>(); string searchVal = HttpUtility.UrlDecode(searchTerm, Encoding.UTF8); /*
//这里是不分词的
predicate = predicate.Or(x => x.bigtitle_t.Contains(searchVal));//文章标题 predicate = predicate.Or(x => x.description_t.Contains(searchVal));//文章描述 predicate = predicate.Or(x => x.details_t.Contains(searchVal));//详情
*/
//使用了盘古分词
Analyzer anal = new PanGuAnalyzer();//使用盘古分词 System.IO.StringReader reader = new System.IO.StringReader(searchVal); Lucene.Net.Analysis.TokenStream ts = anal.TokenStream("", reader); bool hasnext = ts.IncrementToken(); List<string> list = new List<string>(); Lucene.Net.Analysis.Tokenattributes.ITermAttribute ita; while (hasnext) { ita = ts.GetAttribute<Lucene.Net.Analysis.Tokenattributes.ITermAttribute>(); Console.WriteLine(ita.Term); list.Add(ita.Term); hasnext = ts.IncrementToken(); } ts.CloneAttributes(); reader.Close(); anal.Close(); for (var i = 0; i < list.Count; i++) { string str = list[i].ToString(); predicate = predicate.Or(x => x.bigtitle_t.Contains(str));//文章标题 predicate = predicate.Or(x => x.description_t.Contains(str));//文章描述 predicate = predicate.Or(x => x.details_t.Contains(str));//详情 } } return predicate; }
在搜索时,Solr必须是启动的,可以把Solr安装成windows服务自动启动,这样就不用手动去启用。