维基
知识管理系统
维基升级——搜索功能改进
8月29日
通过对虾片(Xapian)一段时间的研究,终于能够实现中文网页的全文检索。MoinMoin 维基中的搜索终于可以使用虾片了!
使用Xapian改进全文检索的效率
MoinMoin维基缺省的全文检索机制是简单的内容查询,用到正则表达式匹配。MoinMoin维基还可以使用可选的Xapian(虾片)进行全文检索。
- 虾片是由C++语言实现的全文搜索引擎,类似于Java世界中的Lucene
- 虾片通过 SWIG 提供各种语言绑定的 API 接口。对于Python来说,安装 python-xapian 即可
- 虾片不支持中文切词,因此中文检索无法实现
- MoinMoin维基还使用自己的切词方法,以便能够正确处理 Wiki Word 的切词,但是也没有考虑到中文切词
我们增加的切词机制,最终让虾片能够支持维基中中文内容的检索。将搜索效率提高十倍以上。
支持附件(Word文档,PDF文档)的全文检索
使用MoinMoin维基内置的搜索引擎不能对附件进行全文检索,是因为缺省的检索是简单的内容查找,而不能动态的(高效的)从附件中提取内容。
改用Xapian搜索引擎后,很容易的就可以实现对Word文档和PDF文档的全文检索:
- 检索是基于事先生成的索引文件
- 每当有附件上传,自动提取附件中的中文内容,并根据内容建立索引
- 搜索时,同时能够显示命中的网页以及附件
那么,如何能够获取Word文档中的内容呢?难道需要安装 Microsoft Office 并通过相应API实现内容提取么?实际上,有一个开源软件 antiword 已经实现了Word文档的中文提取。Antiword支持 Word 2, 6, 7, 97, 2000, 2002 和 2003 等格式。
如何升级到最新维基版本?
升级到最新版本的维基很简单,因为我们已经将升级需要的大部分手工操作都自动化了:
- 更新APT源
sudo apt-get update
- 安装新版本的 MoinMoin
sudo aptitude install ossxp-moinmoin ossxp-moinmoin-xapian
- 自动进行 Xapian 索引数据库的初始化。建立索引的时间根据网站的规模,可能从几十秒种到数十分钟。
- 自动更新 MoinMoin 配置文件,使用 Xapian 作为缺省的全文检索引擎
- 需要手动重启Apache
- 对于老版本库的群英汇Apache,执行
sudo /etc/init.d/ossxp-apache2 restart
- 对于新版本库的群英汇Apache,执行
sudo /etc/init.d/apache2 restart
- 对于老版本库的群英汇Apache,执行
- 自此,您的知识管理平台,将使用新的搜索引擎,进行享用新引擎带来的便利吧。
将博客整合到维基
2月9日
通过 AJAX 技术,我们实现了将博客整合到维基当中。在群英汇的网站首页,你会发现新闻中的头几条来自于博客,你也会发现在首页的右侧的面板中显示6条最新的博客,点击标题即可查看相关博文。
显示三条新闻类别的博客条目的Wiki语法为:
<<jQuery(wordpress,query,http://blog.ossxp.com/rpc/,3,id=.blog-news,cat=12,showdate=prefix)>>
{{{#!wiki blog-news
[[http://blog.ossxp.com/|博客加载中]]...
}}}
在右侧面板中显示6条非新闻类别的博客条目的Wiki语法为:
<<jQuery(wp,query,http://blog.ossxp.com/rpc/,6,id=.blog-latest,cat=-12)>>
{{{#!wiki blog-latest
[[http://blog.ossxp.com/|博客加载中]]...
}}}
维基中 Include 宏的用法
1月21日
提问:
我的目标是列出当前页面下的一级页面: <<Include(^/, "", ,titleonly)>> 这个宏列出了当前页面下的所有子页面(递 归),如何写正则表达式来实现这个要求? 还有就是pagename返回的是什么样的格式呢?是全路径,还是title?
回答:
如果想要列出某个页面,如 SomePage 及其所有子页面,可以使用如下语法: <<Include(^SomePage, "", ,titleonly)>> 会显示页面 SomePage, SomePage/subpage, ..., SomePageABC, ... 如果只想列出 SomePage或者其子页面,使用: <<Include(^SomePage(/.*)?$, "", ,titleonly)>>
提问:
<<Include(^SomePage(/.*)?$, "", ,titleonly)>>, 列出了Somepage下的所有页面,如果我只想列出一级呢? 比如我有如下的目录:系统软件部/内部资料/项目相关文档/上海联通, 我当前在内部资料这个页面设置如上的宏,但是只想列出项目相关文档 这一个页面,这个宏该如何写呢?
回答:
替换一下正则表达式的语法就可以了,可以这样: <<Include(^SomePage(/[^/]*)?$, "", ,titleonly)>> 对于你的例子,可以这样: <<Include(^系统软件部/内部资料/项目相关文档/([^/]*)$, "", ,titleonly)>> 说明: [^/] 的含义是除了 / 以外的字符。
关于 Include 宏的详细用法,参见 群英汇帮助手册相关章节

最新评论