好久没有写关于umbraco的博客了,这段时间在研究solis search,感觉它太强大,好东西是需要分享的,所以写一篇简单的使用博客分享给个人umbraco爱好者。

简介

在了解solis search之前,我们需要简单的了解apache solr, Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。更详细的介绍请充分利用搜索引擎,这里就不做详细介绍了。

solis search就是基于apache solr开发的一个umbraco的插件。它在做了简单的配置之后,就可以检索到umbraco content里面的几乎所有的文字内容,包括上传的文档或者选择的media picker中的文档(word, pdf, excel 等等)。

下载安装

1. 安装JAVA环境

安装java环境是为了运行apache solr server.

下载地址:http://www.java.com/zh_CN/,

下载后安装,安装之后请配置环境变量,是java命令可以直接在命令行根目录运行。如何配置环境变量在这就不介绍了。

2. 安装apache solr

下载地址:http://lucene.apache.org/solr/,这里记住,一定要下载4.5.1版本的,不然使用会出现未知的错误。因为solis search是基于version 4.5开发的。

请参考官方文档进行安装:http://lucene.apache.org/solr/4_5_1/tutorial.html

操作简要说明:

  • 解压压缩包到电脑的任意位置,建议目录全是英文的
  • 打开cmd,进入到目录:solr-4.5.1\example
  • 运行> java -jar start.jar启动solr server.

3. 安装 solis search package

下载:https://www.solissearch.com/download/

推荐下载Solis Search 1.1.15.218 Umbraco package, 下载之后再umbraco后台进行安装

安装过程一般不会出错,如果出了错,请下载手动安装包,根据文档进行安装: https://www.solissearch.com/documentation/

安装之后,找到安装包里面的schema.xml和solrconfig.xml然后 复制到solr的文件夹solr-4.5.1\example\solr\collection1\conf\下面,这一步很重要,然后重启solr server: java -jar start.jar

接着就是rebuild index:

当然在rebuild index之前要根据具体的需要修改配置文件。

在这里,我将我的配置贴出来,并且做简单的介绍,

 <?xml version="1.0"?>
 <SolisSearch>
   <SolrServer address="http://localhost:8983/solr" username="" licenseKey="" />
   <SearchSettings defaultField="text" enableLanguageSupport="true" enabledLanguages="en" highlight="true" highlightFields="text" fragmenter="regex" fragsize="300" defaultOperator="AND" />
   <Languages>
     <Language name="en" rootNode="1064" />
   </Languages>
   <DocTypes>
     <DocType name="default" addPageNameToContent="true">
       <Properties>
         <Property name="p1" property="Name" type="text" content="true" />
         <Property name="r1" property="relatedLinks" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
       </Properties>
     </DocType>
     <DocType name="umbHomePage">
       <Properties>
         <Property name="p1" property="mainHeading" type="text" content="true" />
         <Property name="p2" property="mainContent" type="text" content="true" striphtml="true"/>
       </Properties>
     </DocType>
     <DocType name="newsGroup" addPageNameToContent="true">
       <Properties>
         <Property name="p1" property="Name" type="text" content="true" />
       </Properties>
     </DocType>
     <DocType name="newsItem" addPageNameToContent="true">
       <Properties>
         <Property name="p1" property="title" type="text" content="true" />
         <Property name="p2" property="content" type="text" content="true" striphtml="true"/>
         <Property name="p3" property="downloadFile" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
         <Property name="p4" property="uploadDoc" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
       </Properties>
     </DocType>
   </DocTypes>
   <Facets>
     <Facet type="value" field="doctypes" mincount="0" sort="false" />
     <Facet type="range" field="last_modified" mincount="1">
       <Ranges>
         <FacetRange name="date3" dynamic="thisday" dataType="date" />
         <FacetRange name="date4" dynamic="thisweek" dataType="date" />
         <FacetRange name="date5" dynamic="thismonth" dataType="date" />
         <FacetRange name="date6" dynamic="thisyear" dataType="date" />
         <FacetRange name="date7" dynamic="last" gap="20" dataType="date" />
       </Ranges>
     </Facet>
   </Facets>
 </SolisSearch>

SolrServer:配置solr server的 地址,用户名以及license key.

SearchSettings: 配置当前search的环境,支持的语言,链接操作符,是否高亮等等

DocTypes:这个是重点,用来配置可以搜索出来的content字段

 <DocType name="newsItem" addPageNameToContent="true">
       <Properties>
         <Property name="p1" property="title" type="text" content="true" />
         <Property name="p2" property="content" type="text" content="true" striphtml="true"/>
         <Property name="p3" property="downloadFile" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
         <Property name="p4" property="uploadDoc" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
       </Properties>
 </DocType>

name="newsItem": 将名为newsItem的document type添加到可搜索列表;

addPageNameToContent="true": 表示该document type的name是可搜索的;

Properties: 指定该document type中哪些property是可以被搜索的;

Property: name - 标示符, property - 属性名, type - 搜索的类型, content - 搜索的是内容值

type="relatedLinks": 表示使用solis search的方法去搜索,一般用来搜索word文档,pdf文档中的内容, 需要添加 parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch".

这里的p3和p4表示添加了media picker类型以及upload的类型的属性是可以搜索的。

搜索view代码:

 @using System.Activities.Statements
 @using System.Globalization
 @using SolisSearch.Helpers
 @using SolisSearch.Repositories
 @inherits Umbraco.Web.Macros.PartialViewMacroPage

 @{
     Layout = "../Master.cshtml";
 }

 <h1>@ViewBag.Title</h1>
 <h3>@ViewData["content"]</h3>

 @{
     var query = HttpUtility.UrlDecode(Request.QueryString["q"]);
     var fq = new List<string>();

     <script type="text/javascript">
         $(document).ready(function () {

             $("#txtSearch").keydown(function (e) {
                 ") {
                     $("#searchform").submit();
                 }
             });

             $(".facetlink").click(function () {
                 var filter = $(this).attr("data-filter");
                 $("#filters").append("<input name='fq' type='hidden' value='" + filter + "¤' >");
                 $("#searchform").submit();

             });

             $("#filters").on("click", "a", function () {
                 $(this).prev("input").remove();
                 $("#searchform").submit();
             });
         });
     </script>

     <div class="searchform">
         <form id="searchform" method="GET">
             <input id="txtSearch" autocomplete="off" type="search" name="q" value="@query" />
             <button type="submit">Search</button>

             @if (!String.IsNullOrEmpty(Request["fq"]))
             {
                 fq.AddRange(Request["fq"].TrimEnd(Convert.ToChar("¤")).Split(new[] { "¤," }, StringSplitOptions.RemoveEmptyEntries));
             }

             <div id="filters">
                 @{
                     if (fq.Any())
                     {
                         <h6>Active filters <span>(Click to remove)</span></h6>
                         foreach (var field in fq)
                         {
                             <input name=}¤", field)" />
                             <a href="#">@Html.Raw(GetFriendlyCategoryName(RangeFormatHelper.FormatRange(field)))&nbsp;<i class="fa fa-times"></i></a>
                         }

                     }
                 }

             </div>
         </form>
     </div>

     if (!String.IsNullOrEmpty(query) || fq.Any())
     {
         var languageName = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;

         var searchRepo = new SearchRepository();
         , , null);

         if (searchResultItems.SpellChecking.Any())
         {
             <div class="spellchecking">
                 <h4>Did you mean</h4>
                 @foreach (var spellitem in searchResultItems.SpellChecking)
                 {

                     foreach (var suggestion in spellitem.Suggestions)
                     {
                         <p><a href="?q=@suggestion">@suggestion</a></p>
                     }

                 }
             </div>
         }

         <div class="facets">
             <div>
                 @if (searchResultItems.FacetFields.Any())
                 {
                     var doctypesFacets = searchResultItems.FacetFields["doctypes"];
                     <h4>Category</h4>
                     <ul>
                         @{
                     foreach (var keyValuePair in doctypesFacets)
                     {
                         var friendlyname = GetFriendlyCategoryName(keyValuePair.Key);
                         if (String.IsNullOrEmpty(friendlyname))
                         {
                             continue;
                         }

                         <li>
                             <a }:{}", "doctypes", keyValuePair.Key))" href="javascript:void(0);">
                                 @Html.Raw(friendlyname + " (" + keyValuePair.Value + ")")
                             </a>
                         </li>
                     }
                         }

                     </ul>

                 }
             </div>
             <div>
                 @if (searchResultItems.FacetQueries.Any())
                 {
                     <h4>Date modified</h4>
                     <ul>
                         @foreach (var facetqueries in searchResultItems.FacetQueries)
                         {
                             <li>
                                 <a class="facetlink" data-filter="@facetqueries.Key" data-value="@facetqueries.Key" href="javascript:void(0);">
                                     @Html.Raw(RangeFormatHelper.FormatRange(facetqueries.Key) + " (" + facetqueries.Value + ")")
                                 </a>
                             </li>
                         }
                     </ul>
                 }
             </div>

         </div>

         if (searchResultItems.Any())
         {
             <div class="searchResults">
                 <p>@string.Format("Total of {0} items found", searchResultItems.NumFound)</p>
                 <ol>
                     @foreach (var searchitem in searchResultItems)
                     {
                         <li>
                             <h4><a href="@Html.Raw(searchitem.LinkUrl ?? searchitem.ResourceName)">@Html.Raw(searchitem.Name ?? searchitem.DocumentTitle.FirstOrDefault() ?? Path.GetFileNameWithoutExtension(searchitem.ResourceName))</a></h4>
                             @{
                                 var highlightedSnippets = searchResultItems.Highlights[searchitem.Id];
                                 if (highlightedSnippets != null && highlightedSnippets.Any())
                                 {
                                     foreach (var highlightItem in highlightedSnippets)
                                     {
                                         @Html.Raw(string.Join(" ", highlightItem.Value))
                                     }
                                 }
                                 else
                                 {
                                     var contentString = string.Join(" ", searchitem.Content);
                                     @Html.Raw(contentString.Substring(, Math.Min(contentString.Length, )))
                                 }
                             }
                         </li>
                     }
                 </ol>
             </div>

         }
         else
         {
             <p style="clear: both;">No search results</p>
         }
     }
 }

 @functions
 {

     private string GetFriendlyCategoryName(string doctype)
     {
         if (doctype.Contains("/")) return doctype;
         switch (doctype)
         {
             case "newsItem":
                 return "News Item";
             case "umbHomePage":
                 return "Article";
             default:
                 return "Others";

         }
     }

 }

做了如上操作后,就可以开始使用solis search进行操作了。

有错误的地方,欢迎指出。

参考:

https://www.solissearch.com/

http://baike.baidu.com/view/5649738.htm?fr=aladdin

http://baike.baidu.com/view/371811.htm

尊重原创,转载请说明出处!

高级搜索插件solis search在umbraco中的使用的更多相关文章

  1. 如何使用GOOGLE高级搜索技巧

    如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...

  2. SEO-搜索引擎高级搜索指令

    搜索引擎高级搜索指令 1.双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配.bd和Google 都支持这个指令.例如搜索: & ...

  3. Google高级搜索语法

    Google高级搜索语法   Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...

  4. 【原创】回溯线搜索 Backtracking line search

    机器学习中很多数值优化算法都会用到线搜索(line search).线搜索的目的是在搜索方向上找到是目标函数\(f(x)\)最小的点.然而,精确找到最小点比较耗时,由于搜索方向本来就是近似,所以用较小 ...

  5. 必应代码搜索 Bing Code Search 安装

    微软这几天推出基于bing搜索引擎的  Bing Code Search ,可直接在浏览器上搜索和运行代码.目前中文版必应无法使用本功能,有需要的同学可以转到英文版进行搜索: 英文版必应:  http ...

  6. google、baidu高级搜索技巧

    1.baidu(可以去高级搜索查看更多信息) intitle搜索范围限定在网页标题:intitle:和后面的关键词之间不要有空格----intitle:中国 site搜索范围限定在特定站点中:“sit ...

  7. Google高级搜索技巧十则

    前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您 ...

  8. jQuery页面滚动监听事件及高级效果插件

    jQuery页面滚动监听事件及高级效果插件 1. One Page scroll (只适用于上下焦点图)http://www.thepetedesign.com/demos/onepage_scrol ...

  9. Umbraco中的ModelBuilder

    Umbraco中的ModelBuilder有以下几种形式 Pure Live models Dll models LiveDll models AppData models LiveAppData m ...

随机推荐

  1. JMeter中HTTP Cookie 管理器使用

    案例: 在一次做公司OA系统的时候,发现录制脚本无法回放成功,通过定位,是因为登录的过程中存在重定向,导致登录接口的状态没有自动带入重定向页面 解决方法: 加入HTTP Cookie 管理器使用 现象 ...

  2. asp.net mvc添加多条数据到数据库

    mvc的视图太强大了,个人刚刚接触.(初级菜鸟,懂的不多,往大神们指点)需求是,客户点击添加按钮弹出一个框选择产品后直接添加到表单中,在表单可以自己更改产品的数量,以及一些信息.mvc表单提交的时候只 ...

  3. 基于Jenkins + Git的PHP项目编译脚本

    本文针对的是了解或已经在使用Jenkins和Git的开发者或团队. 本团队使用了Jenkins作为持续集成平台,Git作为版本管理工具,而本人负责的项目是PHP项目,所谓发布项目就是复制文件. 通常有 ...

  4. Java Class文件详解

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) Java Class文件中包含以下信息: [+]view code ClassFile { u4 magic;  ...

  5. 移植SlidingMenu Android library,和安装example出现的问题解决

    很多项目都用到类似左侧滑动菜单的效果,比如facebook,evernote,VLC for android等等,这很酷 源代码可以从GitHub的https://github.com/jfeinst ...

  6. centos6.5编译安装lamp开发环境

    一.系统以及软件的准备 系统及编译安装包的下载地址:http://pan.baidu.com/s/1jIjqinc   密码:ghc2 说明:由于centos6.5是分卷压缩的,且压缩为三个压缩包,所 ...

  7. hdu1521 指数型母函数

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. 架构师速成-如何高效编程 for java

    引子 赵云大喝一声,挺枪骤马杀入重围,左冲右突,如入无人之境.那枪浑身上下,若舞梨花:遍体纷纷,如飘瑞雪. 赵云是所有历史人物中我最喜欢的一个,如果放到现代,他走了it的道路,一定可以成为一个编程高手 ...

  9. php with bootstrap

    最近用ThinkPHP+bootstrap3写的后台 用bootstrap结合php搭建MIS系统框架 Free Bootstrap Themes & Templates pgoa盘古OA开发 ...

  10. Linux内核--网络栈实现分析(一)--网络栈初始化--转

    转载地址 http://blog.csdn.net/yming0221/article/details/7488828 作者:闫明 本文分析基于内核Linux Kernel 1.2.13 以后的系列博 ...