虽然DotNetNuke在欧美的应用很广,但是很多人觉得DNN在中国有些水土不服,我也有些这方面的感觉,DNN在中文化的进程上还有很长的路要走。前一阵子发布的DNN 5汉化包大 家的反响不错,最近征询了一些朋友的意见后,决定进一步解决一下DNN中文搜索的问题,制作一个DNN中文搜索Provider。这个Provider通 过整合中科院的中文分词方案完美的解决了DNN中文索引,搜索的问题,识别率高达98%以上,并且借助DNN5新引入的强大的扩展机制安装十分简单。
在DotNetNuke中默认的网站内容索引和搜索方式完全是按照英语习惯所定制的,同样的方法对中文来说完全行不通,这也就是为什么很多人发现中文内容 在DNN中无法搜索。好在DNN的Provider框架提供了很友好的扩展机制,在不改动DNN核心的情况下,我制作了一个“DNN中文搜索 Provider”,通过在网站后台安装这个Provider可以无缝的解决中英文内容索引和搜索的问题。
之所以默认的DotNetNuke搜索和索引方式不支持中文完全是因为英文单词是以空格划分,中文就复杂得多了,中文单词以语意划分没有明显的词边界,这样一来以空格区分单词的方式对中文就完全无效了。我在这里简单地提一下DNN的索引和搜索原理。
为什么要索引就是因为索引后的内容可以被快速的检索到,有人问为什么不用SQL %%全文匹配的语句搜索,那是因为全文匹配是很消耗数据库资源而且很慢的方法,并且这种方法局限性比较大,搜索的内容必须完全匹配才能得到结果。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需要手动进行以下步骤
这些在DNN5里边就好像安装普通模块一样简单。
在安装好后如果你马上搜索中文内容会发现还是没有任何结果, 这是因为我们需要用新的中文搜索provider来重新索引站内的中文内容。这里有两种方法可以重新索引DNN内容
确定是否成功索引中文内容最简单的方法就是察看数据库的[SearchWord]表,看里面是不是已经存入了分割好的中文单词,如果成功索引在站内搜索搜索中文就可以显示正确的结果了。