好久没有写关于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.
下载后安装,安装之后请配置环境变量,是java命令可以直接在命令行根目录运行。如何配置环境变量在这就不介绍了。
2. 安装apache solr
下载地址:http://lucene.apache.org/solr/,这里记住,一定要下载4.5.1版本的,不然使用会出现未知的错误。因为solis search是基于version 4.5开发的。
操作简要说明:
解压压缩包到电脑的任意位置,建议目录全是英文的
打开cmd,进入到目录:solr-4.5.1\example
运行> java -jar start.jar启动solr server.
3. 安装 solis search package
安装之后,找到安装包里面的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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
View Code
SolrServer:配置solr server的 地址,用户名以及license key.
SearchSettings: 配置当前search的环境,支持的语言,链接操作符,是否高亮等等
DocTypes:这个是重点,用来配置可以搜索出来的content字段
1
2
3
4
5
6
7
8
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.Statements2 @using System.Globalization3 @using SolisSearch.Helpers4 @using SolisSearch.Repositories5 @inherits Umbraco.Web.Macros.PartialViewMacroPage6
7 @{8 Layout = "../Master.cshtml";9 }10
11
12
@ViewBag.Title
13
@ViewData["content"]
14
15 @{16 var query = HttpUtility.UrlDecode(Request.QueryString["q"]);17 var fq = new List();18
19
20
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("");32 $("#searchform").submit();33
34 });35
36 $("#filters").on("click", "a", function () {37 $(this).prev("input").remove();38 $("#searchform").submit();39 });40 });41
42
43
44
45
46 Search
47
48 @if (!String.IsNullOrEmpty(Request["fq"]))49 {50 fq.AddRange(Request["fq"].TrimEnd(Convert.ToChar("¤")).Split(new[] { "¤,"}, StringSplitOptions.RemoveEmptyEntries));51 }52
53
54 @{55 if(fq.Any())56 {57
Active filters (Click to remove)
58 foreach (var field infq)59 {60
61 @Html.Raw(GetFriendlyCategoryName(RangeFormatHelper.FormatRange(field)))
62 }63
64 }65 }66
67
68
69
70
71
72 if (!String.IsNullOrEmpty(query) ||fq.Any())73 {74 var languageName =CultureInfo.CurrentCulture.TwoLetterISOLanguageName;75
76 var searchRepo = newSearchRepository();77 var searchResultItems = searchRepo.SearchIndex(query, fq.ToArray(), 1, 0, null);78
79 if(searchResultItems.SpellChecking.Any())80 {81
82
Did you mean
83 @foreach (var spellitem insearchResultItems.SpellChecking)84 {85
86 foreach (var suggestion inspellitem.Suggestions)87 {88
89 }90
91 }92
93 }94
95
96
97 @if (searchResultItems.FacetFields.Any())98 {99 var doctypesFacets = searchResultItems.FacetFields["doctypes"];100
Category
101
102 @{103 foreach (var keyValuePair indoctypesFacets)104 {105 var friendlyname =GetFriendlyCategoryName(keyValuePair.Key);106 if(String.IsNullOrEmpty(friendlyname))107 {108 continue;109 }110
111
113 @Html.Raw(friendlyname + "(" + keyValuePair.Value + ")")114
115
116 }117 }118
119
120
121
122 }123
124
125 @if (searchResultItems.FacetQueries.Any())126 {127
Date modified
128
129 @foreach (var facetqueries insearchResultItems.FacetQueries)130 {131
133 @Html.Raw(RangeFormatHelper.FormatRange(facetqueries.Key) + "(" + facetqueries.Value + ")")134
135
136 }137
138 }139
140
141
142
143 if(searchResultItems.Any())144 {145
146
@string.Format("Total of {0} items found", searchResultItems.NumFound)
147
148 @foreach (var searchitem insearchResultItems)149 {150
151
@Html.Raw(searchitem.Name ?? searchitem.DocumentTitle.FirstOrDefault() ?? Path.GetFileNameWithoutExtension(searchitem.ResourceName))
152 @{153 var highlightedSnippets =searchResultItems.Highlights[searchitem.Id];154 if (highlightedSnippets != null &&highlightedSnippets.Any())155 {156 foreach (var highlightItem inhighlightedSnippets)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
168 }169
170
171
172 }173 else
174 {175
No search results
176 }177 }178 }179
180 @functions181 {182
183 private string GetFriendlyCategoryName(stringdoctype)184 {185 if (doctype.Contains("/")) returndoctype;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 }
View Code
做了如上操作后,就可以开始使用solis search进行操作了。
有错误的地方,欢迎指出。
参考:
尊重原创,转载请说明出处!