DotNetNuke - DNN中文搜索解决方案 (附下载)
虽然DotNetNuke在欧美的应用很广,但是很多人觉得DNN在中国有些水土不服,我也有些这方面的感觉,DNN在中文化的进程上还有很长的路要走。前一阵子发布的DNN 5汉化包大家的反响不错,最近征询了一些朋友的意见后,决定进一步解决一下DNN中文搜索的问题,制作一个DNN中文搜索Provider。这个Provider通过整合中科院的中文分词方案完美的解决了DNN中文索引,搜索的问题,识别率高达98%以上,并且借助DNN5新引入的强大的扩展机制安装十分简单。
dnnmix.com于2009年6月5号发布 适用于DNN5以上的版本
前言
在DotNetNuke中默认的网站内容索引和搜索方式完全是按照英语习惯所定制的,同样的方法对中文来说完全行不通,这也就是为什么很多人发现中文内容在DNN中无法搜索。好在DNN的Provider框架提供了很友好的扩展机制,在不改动DNN核心的情况下,我制作了一个“DNN中文搜索Provider”,通过在网站后台安装这个Provider可以无缝的解决中英文内容索引和搜索的问题。
DNN搜索原理
之所以默认的DotNetNuke搜索和索引方式不支持中文完全是因为英文单词是以空格划分,中文就复杂得多了,中文单词以语意划分没有明显的词边界,这样一来以空格区分单词的方式对中文就完全无效了。我在这里简单地提一下DNN的索引和搜索原理。
DNN网站内容索引
为什么要索引就是因为索引后的内容可以被快速的检索到,有人问为什么不用SQL %%全文匹配的语句搜索,那是因为全文匹配是很消耗数据库资源而且很慢的方法,并且这种方法局限性比较大,搜索的内容必须完全匹配才能得到结果。DNN索引的基本步骤是:
- DNN的调度管理系统(Scheduler)会定期察看网站是否有新添加或更新的内容
- 提取,新添加或更新的内容后进行分词
- 过滤分割后的单词,去掉已存在的单词,以及不符合规则的单词(例如太短)
- 通过分析后把新单词以及它在文章中的位置,出现频率,相关联的模块信息全部存入数据库
DNN站内搜索
DNN站内搜索的基本步骤是:
- 获取用户输入的搜索内容
- 对用户输入的搜索关键词或短语进行分词后得到一个或一系列单词
- 把得到的单词和数据库中索引好的单词匹配,并根据词频和位置排序
- 把排序后单词所在的模块标题,模块简介和模块所在的页面链接返回得到搜索结果
DNN中文搜索解决方案
我们可以看到因为没有合适的中文分词方法导致索引的2,3,4步无法正常进行,最终什么也没索引到, 搜索时第2步也因为没有合适的分词方法无法正确的分析用户所输入的中文内容, 另外就算用户输入的是简单的内容,因为之前索引信息没有生成所以第3,4步也是没法正确执行的,最后的结果就是什么也搜索不到。 在这里要感谢一下QQ群里的崔海波同学,海波把他的中文搜索解决方案给我参考,我本来是想直接转换成dnn provider,后来发现其中用到的分词方法NICTCLAS没法在vista下运行,察看了NICTCLAS的源码重新编译后有100多个警告,还是没法正常运行,就没继续花时间再研究,反正网上中文分词的方法有很多。最后选中了两种KTDictSeg和SharpICTCLAS, 经过一些测试比较后感觉SharpICTCLAS的结果更准确些。SharpICTCLAS是中科院计算所开发的ICTCLAS分词系统的C#版本,果然是有两把刷子。 确定了分词法后就开始着手对DNN默认的搜索provider改进, 并且针对中文搜索做了一些优化, 减少数据库读取的次数。整体测试后效果非常满意。接下来就着手开始打包Provider, 在DNN 5中因为引入了统一扩展包的概念,不光模块可以打包安装,就连Provider, 语言包, 皮肤控件都可以打成DNN扩展包,并通过统一的扩展包安装向导安装, 这极大地简化好像provider这类扩展的安装过程。如果在DNN4安装Provider需要手动进行以下步骤
- 上传dll文件到网站bin文件夹
- 上传和provider相关的文件到网站provider文件夹
- 修改web.config, 添加新的provider并且设为默认
这些在DNN5里边就好像安装普通模块一样简单。
如何在DNN5中安装DnnMix中文搜索Provider
- 下载汉化搜索扩展包,不需要解压缩
- 用主机管理员帐号(host)登陆
- 注意页面左上角控制面的里的 “显示方式” 请选择“编辑”
- 在菜单里选择 “主机管理 -> 功能扩展” 页面
- 在页面最下面选择 “扩展安装向导 ” 然后按照步骤提示安装就好了
- 请注意在安装过程中会提示“ 此扩展包含无效的文件类型”, 这里因为provider所带的中文字典文件使用了特殊的类型,只要忽略警告继续就好了
如何重新索引中文内容
在安装好后如果你马上搜索中文内容会发现还是没有任何结果, 这是因为我们需要用新的中文搜索provider来重新索引站内的中文内容。这里有两种方法可以重新索引DNN内容
- 等待DNN的调度管理系统(Scheduler)定期自动运行索引,或者在调度管理中重新启动DotNetNuke.Services.Search.SearchEngineScheduler这个任务
- 在 “主机管理 -> 搜索管理” 中点击“更新索引”就好了
确定是否成功索引中文内容最简单的方法就是察看数据库的[SearchWord]表,看里面是不是已经存入了分割好的中文单词,如果成功索引在站内搜索搜索中文就可以显示正确的结果了。
欢迎加入DNN QQ群讨论
DNN MSN 群: group247485@msnzone.cn
出处: DnnMix DotNetNuke 博客
原文链接: DotNetNuke - DNN中文搜索解决方案 (附下载)
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明