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服务自动启动,这样就不用手动去启用。