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

  • 相关阅读:
    Discuz论坛自动发帖机
    C#测试数据库连接是否成功
    JS重写提示框(confirm)
    随笔 选择
    随笔 诚实
    web项目经理手册【1】版本控制流程
    Asp.net多层架构中的变量引用与传递
    ASP.NET跨页面传值技巧总结
    web项目经理手册【3】Code Review
    web项目经理手册【7】项目经理需要铭记在心的话
  • 原文地址:https://www.cnblogs.com/ljh19/p/11063217.html
Copyright © 2020-2023  润新知