高级搜索插件solis search在umbraco中的使用

好久没有写关于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之前要根据具体的需要修改配置文件。

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

 1 <?xml version="1.0"?>
 2 <SolisSearch>
 3   <SolrServer address="http://localhost:8983/solr" username="" licenseKey="" />
 4   <SearchSettings defaultField="text" enableLanguageSupport="true" enabledLanguages="en" highlight="true" highlightFields="text" fragmenter="regex" fragsize="300" defaultOperator="AND" />
 5   <Languages>
 6     <Language name="en" rootNode="1064" />
 7   </Languages>
 8   <DocTypes>
 9     <DocType name="default" addPageNameToContent="true">
10       <Properties>
11         <Property name="p1" property="Name" type="text" content="true" />
12         <Property name="r1" property="relatedLinks" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
13       </Properties>
14     </DocType>
15     <DocType name="umbHomePage">
16       <Properties>
17         <Property name="p1" property="mainHeading" type="text" content="true" />
18         <Property name="p2" property="mainContent" type="text" content="true" striphtml="true"/>
19       </Properties>
20     </DocType>
21     <DocType name="newsGroup" addPageNameToContent="true">
22       <Properties>
23         <Property name="p1" property="Name" type="text" content="true" />
24       </Properties>
25     </DocType>
26     <DocType name="newsItem" addPageNameToContent="true">
27       <Properties>
28         <Property name="p1" property="title" type="text" content="true" />
29         <Property name="p2" property="content" type="text" content="true" striphtml="true"/>
30         <Property name="p3" property="downloadFile" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
31         <Property name="p4" property="uploadDoc" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
32       </Properties>
33     </DocType>
34   </DocTypes>
35   <Facets>
36     <Facet type="value" field="doctypes" mincount="0" sort="false" />
37     <Facet type="range" field="last_modified" mincount="1">
38       <Ranges>
39         <FacetRange name="date3" dynamic="thisday" dataType="date" />
40         <FacetRange name="date4" dynamic="thisweek" dataType="date" />
41         <FacetRange name="date5" dynamic="thismonth" dataType="date" />
42         <FacetRange name="date6" dynamic="thisyear" dataType="date" />
43         <FacetRange name="date7" dynamic="last" gap="20" dataType="date" />
44       </Ranges>
45     </Facet>
46   </Facets>
47 </SolisSearch>

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

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

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

1 <DocType name="newsItem" addPageNameToContent="true">
2       <Properties>
3         <Property name="p1" property="title" type="text" content="true" />
4         <Property name="p2" property="content" type="text" content="true" striphtml="true"/>
5         <Property name="p3" property="downloadFile" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
6         <Property name="p4" property="uploadDoc" type="relatedLinks" parser="SolisSearch.Parsers.RelatedLinksParser,SolisSearch" />
7       </Properties>
8 </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代码:

  1 @using System.Activities.Statements
  2 @using System.Globalization
  3 @using SolisSearch.Helpers
  4 @using SolisSearch.Repositories
  5 @inherits Umbraco.Web.Macros.PartialViewMacroPage
  6
  7 @{
  8     Layout = "../Master.cshtml";
  9 }
 10
 11
 12 <h1>@ViewBag.Title</h1>
 13 <h3>@ViewData["content"]</h3>
 14
 15 @{
 16     var query = HttpUtility.UrlDecode(Request.QueryString["q"]);
 17     var fq = new List<string>();
 18
 19
 20     <script type="text/javascript">
 21         $(document).ready(function () {
 22
 23             $("#txtSearch").keydown(function (e) {
 24                 if (e.which == "13") {
 25                     $("#searchform").submit();
 26                 }
 27             });
 28
 29             $(".facetlink").click(function () {
 30                 var filter = $(this).attr("data-filter");
 31                 $("#filters").append("<input name=‘fq‘ type=‘hidden‘ value=‘" + filter + "¤‘ >");
 32                 $("#searchform").submit();
 33
 34             });
 35
 36             $("#filters").on("click", "a", function () {
 37                 $(this).prev("input").remove();
 38                 $("#searchform").submit();
 39             });
 40         });
 41     </script>
 42
 43     <div class="searchform">
 44         <form id="searchform" method="GET">
 45             <input id="txtSearch" autocomplete="off" type="search" name="q" value="@query" />
 46             <button type="submit">Search</button>
 47
 48             @if (!String.IsNullOrEmpty(Request["fq"]))
 49             {
 50                 fq.AddRange(Request["fq"].TrimEnd(Convert.ToChar("¤")).Split(new[] { "¤," }, StringSplitOptions.RemoveEmptyEntries));
 51             }
 52
 53             <div id="filters">
 54                 @{
 55                     if (fq.Any())
 56                     {
 57                         <h6>Active filters <span>(Click to remove)</span></h6>
 58                         foreach (var field in fq)
 59                         {
 60                             <input name="fq" type="hidden" value="@string.Format("{0}¤", field)" />
 61                             <a href="#">@Html.Raw(GetFriendlyCategoryName(RangeFormatHelper.FormatRange(field)))&nbsp;<i class="fa fa-times"></i></a>
 62                         }
 63
 64                     }
 65                 }
 66
 67             </div>
 68         </form>
 69     </div>
 70
 71
 72     if (!String.IsNullOrEmpty(query) || fq.Any())
 73     {
 74         var languageName = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
 75
 76         var searchRepo = new SearchRepository();
 77         var searchResultItems = searchRepo.SearchIndex(query, fq.ToArray(), 1, 0, null);
 78
 79         if (searchResultItems.SpellChecking.Any())
 80         {
 81             <div class="spellchecking">
 82                 <h4>Did you mean</h4>
 83                 @foreach (var spellitem in searchResultItems.SpellChecking)
 84                 {
 85
 86                     foreach (var suggestion in spellitem.Suggestions)
 87                     {
 88                         <p><a href="[email protected]">@suggestion</a></p>
 89                     }
 90
 91                 }
 92             </div>
 93         }
 94
 95         <div class="facets">
 96             <div>
 97                 @if (searchResultItems.FacetFields.Any())
 98                 {
 99                     var doctypesFacets = searchResultItems.FacetFields["doctypes"];
100                     <h4>Category</h4>
101                     <ul>
102                         @{
103                     foreach (var keyValuePair in doctypesFacets)
104                     {
105                         var friendlyname = GetFriendlyCategoryName(keyValuePair.Key);
106                         if (String.IsNullOrEmpty(friendlyname))
107                         {
108                             continue;
109                         }
110
111                         <li>
112                             <a class="facetlink" data-filter="@Html.Raw(string.Format("{0}:{1}", "doctypes", keyValuePair.Key))" href="javascript:void(0);">
113                                 @Html.Raw(friendlyname + " (" + keyValuePair.Value + ")")
114                             </a>
115                         </li>
116                     }
117                         }
118
119                     </ul>
120
121
122                 }
123             </div>
124             <div>
125                 @if (searchResultItems.FacetQueries.Any())
126                 {
127                     <h4>Date modified</h4>
128                     <ul>
129                         @foreach (var facetqueries in searchResultItems.FacetQueries)
130                         {
131                             <li>
132                                 <a class="facetlink" data-filter="@facetqueries.Key" data-value="@facetqueries.Key" href="javascript:void(0);">
133                                     @Html.Raw(RangeFormatHelper.FormatRange(facetqueries.Key) + " (" + facetqueries.Value + ")")
134                                 </a>
135                             </li>
136                         }
137                     </ul>
138                 }
139             </div>
140
141         </div>
142
143         if (searchResultItems.Any())
144         {
145             <div class="searchResults">
146                 <p>@string.Format("Total of {0} items found", searchResultItems.NumFound)</p>
147                 <ol>
148                     @foreach (var searchitem in searchResultItems)
149                     {
150                         <li>
151                             <h4><a href="@Html.Raw(searchitem.LinkUrl ?? searchitem.ResourceName)">@Html.Raw(searchitem.Name ?? searchitem.DocumentTitle.FirstOrDefault() ?? Path.GetFileNameWithoutExtension(searchitem.ResourceName))</a></h4>
152                             @{
153                                 var highlightedSnippets = searchResultItems.Highlights[searchitem.Id];
154                                 if (highlightedSnippets != null && highlightedSnippets.Any())
155                                 {
156                                     foreach (var highlightItem in highlightedSnippets)
157                                     {
158                                         @Html.Raw(string.Join(" ", highlightItem.Value))
159                                     }
160                                 }
161                                 else
162                                 {
163                                     var contentString = string.Join(" ", searchitem.Content);
164                                     @Html.Raw(contentString.Substring(0, Math.Min(contentString.Length, 175)))
165                                 }
166                             }
167                         </li>
168                     }
169                 </ol>
170             </div>
171
172         }
173         else
174         {
175             <p style="clear: both;">No search results</p>
176         }
177     }
178 }
179
180 @functions
181 {
182
183     private string GetFriendlyCategoryName(string doctype)
184     {
185         if (doctype.Contains("/")) return doctype;
186         switch (doctype)
187         {
188             case "newsItem":
189                 return "News Item";
190             case "umbHomePage":
191                 return "Article";
192             default:
193                 return "Others";
194
195         }
196     }
197
198 }

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

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

参考:

https://www.solissearch.com/

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

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

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

时间: 2024-11-10 07:26:30

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

值得珍藏:印象笔记Evernote中进行高级搜索的语法分享

印象笔记/Evernote中的搜索我觉得有三大特色: 使用专用语法进行高级搜索 高级版用户支持在pdf.图片中搜索文字 把搜索保存起来,加入快捷方式 今天我想把我搜集的关于在印象笔记Evernote里进行高级搜索的语法共享给大家,大家可以结合自己的需求创建好各种搜索语句,然后保存到快捷方式,提高"用"笔记的效率.例如我的快捷方式了保存了这样的搜索条件: 继续阅读>>

dedecms隐藏高级搜索中的隐藏栏目的方法

今天发现,禁止搜索隐藏栏目内容后,发现,高级搜索里仍有隐藏栏目版块,经测试,找到解决办法如下:一.找到并打开heightsearch.htm模板(templates\plus\下),在第34行,找到$typeOptions = $tl->GetOptionArray(0,0,0);将其改为$typeOptions = $tl->GetOptionArray(0,0,1);解释如下:第三个参数表示栏目类型(即文章集),改为1表示文章集类栏目,0表示所有频道二.找到并打开include\typel

OpenERP-限制高级搜索字段范围(Restrict the fields can be seen in &quot;advanced search&quot;)

因为高级搜索包含对象的所有字段,默认没有做限制.有时候不希望暴露太多字段给用户,所以可以使用如下方法,使高级搜索与普通搜索的字段范围相同. By default, the advanced search function can search by all of the object's fields. But sometimes, we don't want the user to know much about the inner structure, so we can use below

Google高级搜索

GOOGLE搜索命令:filetype:pdf SEO 返回的就是包含SEO 这个关键词的所有pdf 文件site:是SEO 最熟悉的高级搜索指令,用来搜索某个域名下的所有文件.what's my location/IP 电脑的IP地址.do a barrel roll"或者"Z or R twice",让你的页面旋转360°zerg rush 从页面上方降下很多圆圈"Google Gravity",让你无视牛顿万有引力.Google Sphere&quo

如何使用GOOGLE高级搜索技巧

原文出处: 新浪博客(未找到原始出处) 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于1999年创立.2000年7月份,Google替代Inktomi成为Yahoo公司的搜索引擎,同年9月份,Google成为中国网易公司的搜索引擎.98年至今,GOOGLE已经获得30多项业界大奖. 二,GOOGLE特色 GOOGLE支持多达132种语言,包括简体中

超级搜索(Super search)

插件介绍: 现在的搜索引擎会极大的帮助用户搜索到想要的搜索的内容,我们常用的搜索引擎包括百度.搜狗.360搜索等等,今天就为大家推荐一个超级搜索的插件.超级搜索基于浏览器的全面搜索.智能识别搜索关键字,集成收藏夹(书签)搜索,历史记录搜索等功能.支持自定义扩展搜索,支持打开搜索结果列表等功能. 使用说明: 在谷歌应用商店里安装超级搜索(Super search),并在扩展器里启动它,点击chromeos右上角的超级搜索插件,该插件会弹出一个搜索的下拉框,在下拉框的文本框中输入想要搜索的内容,并在

ZKEACMS 全站搜索插件

ZKEACMS 全站搜索插件 让ZKEACMS支持搜索功能 数据库 Microstft Sql Server 2008R2 以上 页面的索引主要是运用了MsSql的全文索引,如果你还不了解全文索引,可以使用以下链接来了解全文索引的相关知识 https://docs.microsoft.com/zh-cn/sql/relational-databases/search/full-text-search 目前仅支持MsSql数据库,如果正好你不是使用MsSql数据库的话,也没有关系,它将很容易改造成

高级搜索技巧

1.双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配.bd和Google 都支持这个指令.例如搜索: “seo方法图片” 2.减号 减号代表搜索不包含减号后面的词的页面.使用这个指令时减号前面必须是空格,减号后面没有空格,紧跟着需要排除的词.Google 和bd都支持这个指令.例如:搜索 -引擎返回的则是包含“搜索”这个词,却不包含“引擎”这个词的结果 3.星号星号*是常用的通配符,也可以用在搜索中.百度不支持*号搜索指令

快速搜索变高级搜索,快速搜索结果准确率提高

在MAGENTO的快速搜索中往往得不到好的结果,要嘛是查询不到产品,要嘛是所有产品都列出来,不像高级搜索结果那样理想. 有没有把快速搜索效率提高到高级搜索那个水平呢,可以按下面方法做: Do a full DB backup (just in case) (以下操作万一出现问题了,能够还原,最好第一步就是备份数据库及要目录下的APP文件夹.) Replace “OR” with “AND” app/code/core/Mage/CatalogSearch/Model/Resource/Fullt