高级搜索插件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之前要根据具体的需要修改配置文件。
在这里,我将我的配置贴出来,并且做简单的介绍,
<?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) {
if (e.which == "") {
$("#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("{}¤", 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(), , , 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("{}:{}", "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进行操作了。
有错误的地方,欢迎指出。
参考:
http://baike.baidu.com/view/5649738.htm?fr=aladdin
http://baike.baidu.com/view/371811.htm
尊重原创,转载请说明出处!
高级搜索插件solis search在umbraco中的使用的更多相关文章
- 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)
1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...
- Umbraco examine search media folder 中的pdf文件
可以参考的文章 http://sleslie.me/2015/selecting-media-using-razor-slow-performance-examine-to-the-rescue/ h ...
- 谷歌商店高级搜索 Google play advanced search
这个问题一直搜索了很久都没有答案,后来在StackOverflow上提问,很久也没人回答. 详见我的SO:https://stackoverflow.com/questions/52939493/ho ...
- Docker安装带中文全文搜索插件zhparser的Postgresql数据库
上一篇讲了在已经安装了PG数据库的情况下,安装全文搜索插件zhparser遇到的问题.在一个全新的环境中安装带有全文搜索插件zhparser的PG数据库,可以使用已经做好的Docker镜像,在安装的过 ...
- 如何使用GOOGLE高级搜索技巧
如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...
- SEO-搜索引擎高级搜索指令
搜索引擎高级搜索指令 1.双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配.bd和Google 都支持这个指令.例如搜索: & ...
- 65. XPages自定义控件(三)高级搜索之三
RecordView控件的两个文件的完整代码在本文末尾给出.虽说完整,仅靠这两个文件,RecordView控件还不能正常工作,因为在这两个文件里还引用了其他自定义控件,调用了作为managed bea ...
- ZKEACMS添加搜索功能,搜索插件说明
ZKEACMS默认是不支持搜索功能的.但是搜索功能是比较常用的一个功能,使用这个搜索插件,可以让CMS支持搜索: 如下图所示: 数据库 Microstft Sql Server 2008R2 以上 页 ...
- 使用 Google 高级搜索的一些技巧
一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于 ...
随机推荐
- CSS3 transition效果 360度旋转 旋转放大 放大 移动
效果一:360°旋转 修改rotate(旋转度数) * { transition:All 0.4s ease-in-out; -webkit-transition:All 0.4s ease-in-o ...
- ln 软硬链接
链接 在谈软链接与硬链接之前,先来说说文件系统基础知识. Linux 系统中,一切皆文件. 文件包含两部分:文件属性与权限(inode),文件内容(data-block). 一个文件可由1个inode ...
- C#编程语言与面向对象—— 多态
多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- jstl 标签库的使用
JSTL 核心标签库 使用 JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.ot ...
- ns115 step by step
一,安装环境: sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev lib ...
- CE 进程间通信
WINCE下进程间通信常用的方式有:剪贴板(Clipboard),网络套接字(Socket),WM_COPYDATA消息,共享内存,管道(消息队列),注册表等 剪贴板 //////////////// ...
- Monkey工具使用详解
上节中介绍了Monkey工具使用环境的搭建,传送门..本节我将详细介绍Monkey工具的使用. 一.Monkey测试简介 Monkey测试是Android平台自动化的一种手段,通过Monkey程序模拟 ...
- [课程设计]Scrum 1.7 多鱼点餐系统开发进度
[课程设计]Scrum 1.7 多鱼点餐系统开发进度(点餐菜式内容添加及美化) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题 ...
- memcache/memcached安装教程并应用Tinkphp3.2
在自己的新程序中打算全面应用memcached技术,这个很容易理解这是memcached是内存缓存,但是怎么还有memcache呢?其实很简单,memcache是php的一个扩展,用于php管理mem ...