您的位置:首页 > 其它

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

2014-12-14 12:48 148 查看
好久没有写关于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

@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) {
if (e.which == "13") {
$("#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="fq" type="hidden" value="@string.Format("{0}¤", field)" />
<a href="#">@Html.Raw(GetFriendlyCategoryName(RangeFormatHelper.FormatRange(field))) <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();
var searchResultItems = searchRepo.SearchIndex(query, fq.ToArray(), 1, 0, 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 class="facetlink" data-filter="@Html.Raw(string.Format("{0}:{1}", "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(0, Math.Min(contentString.Length, 175)))
}
}
</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";

}
}

}


View Code

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

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

参考:

https://www.solissearch.com/

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

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

尊重原创,转载请说明出处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: