这篇文章我来说明一下hubble+sqlserver,在接下来我还会写一篇hubble+mongodb的文章。在这里主要先介绍hubble和MSsqlserver的用法。
1,hubble.net
首先我先来简单介绍一下hubble,hubble主要在项目中的应用还是在全文搜索上,它和lucene有本质的不同,当然各自有各自的优点,而且hubble有逐渐取代lucene的趋势。我自己也进行了一下测试,测试结果待会再说。
简单的先说一下hubble的安装,hubble的下载地址:http://hubbledotnet.codeplex.com/releases/view/44680 。注意你的机器,是×86的还是64的,选择自己相同的信号下载,安装时候需要注意,需要输入一个key这个是免费获取的,
获取的网站http://www.hubbledotnet.com/key.aspx。填上邮箱很快就发到你邮箱里。
安装完成后,打开hubble提示下图,填上127.0.0.1即可
下图就是进入后的主界面,跟sqlserver很像,用法也很像
接下来你可以选择升级,如果不升级的话,这么用完全没有问题,但是如果你想用hubble+mongodb的话,就得进行升级,升级的方法我在hubble+mongodb里再去写吧,这里就不升级了,用默认的。
下面进行创建数据库点击鼠标右键,在弹出的菜单选择CreateDataBase,如下图:
打开CreateDataBase窗口,填写信息如下(第一个是数据库名称,第二个是数据库位置,第三个是数据库种类,如果是sqlserver2005以上的版本就选择sqlserver2005,最后一个是链接字符串)
在建立的News数据库上单击鼠标右键,在弹出的菜单上选择Create Table项,如下图:
打开Create Table窗口,并填写建表的相关信息(第一个参数是表名,第二个是表的位置,第三个是链接的数据库,最后一个是链接字符串),如下图:
点击Next按钮,并填写相关信息(这是最重要一步),如下图:index model是选择hubble的模式,是主动还是被动(主动和被动在程序中所用的代码是不一样的),主动的意思我简单的说,例如我新建一张hubble表,你再到sqlserver中看一下,数据库中也回自动添加一张表,也就是说用主动模式的话,你如果想要添加数据,直接在hubble进行添加就行了。但是如果是被动(build index from exist table)的话,你如果想要用代码添加数据,你必须同时往sqlserver和hubble里同时添加。一般采用被动的方式的比较多,这种方法比较灵活。exist table name or view name (这个很简单吧,就是表名,但是这里是指的sqlserver里的那个你要关联的表)。incremental model 这个是hubble的模式,从英文意思就能看出来第一个是只能增加,不能修改,所以一般都是选择第二种。
然后点击next 如图(这里面主要说的就是要选择一个字段作ID,手动写在下面。还有就是analyzer,分词器,有三个可以选择,就是不同的分词器,我习惯用pangu,盘古在分中文词汇还是比较好的)
点击next如图(其实就是把我们的操作生成了一个脚本,如果自己特别熟悉hubble的语法后就可以直接用命令输入了,这跟sqlserver是一样的)
提示是否创建索引图如下点击是
点击是后开始创建,如图,点击start开始创建
完成后关闭,hubble的表就创建好了。
HubbleHandler的代码如下
1 internal class HubbleHandler 2 { 3 static string connStr = ConfigurationManager.AppSettings["hubble"];//连接字符串 4 public static void ExecuteNonQuery(string hubbleSql, HubbleParameterCollection parameters) 5 { 6 using (HubbleAsyncConnection conn = new HubbleAsyncConnection(connStr)) 7 { 8 conn.Open(); 9 HubbleCommand matchCmd = new HubbleCommand(hubbleSql, conn); 10 for (int i = 0; i < parameters.Count; i++) 11 matchCmd.Parameters.Add(parameters[i].ParameterName, parameters[i].Value); 12 try { matchCmd.ExecuteNonQuery(); } 13 catch { } 14 } 15 } 16 17 public static DataSet ExecuteSelect(string hubbleSql, HubbleParameterCollection parameters, out int count) 18 { 19 DataSet ds = new DataSet(); count = 0; 20 using (HubbleAsyncConnection conn = new HubbleAsyncConnection(connStr)) 21 { 22 conn.Open(); 23 HubbleDataAdapter adapter = new HubbleDataAdapter(); 24 adapter.SelectCommand = new HubbleCommand(hubbleSql, conn); 25 int cacheTimeout = 10; 26 adapter.SelectCommand.CacheTimeout = cacheTimeout;//秒 27 for (int i = 0; i < parameters.Count; i++) 28 adapter.SelectCommand.Parameters.Add(parameters[i].ParameterName, parameters[i].Value); 29 HubbleCommand cmd = adapter.SelectCommand; 30 try 31 { 32 ds = cmd.Query(cacheTimeout); 33 count = ds.Tables[0].MinimumCapacity; 34 } 35 catch { } 36 } 37 return ds; 38 } 39 40 41 }
这样的话,你就可以根据hubble里所连接sqlserver的数据进行查询了。查询的一些基本语句,模糊匹配有match和contains
select top 10 * from News where title match '你好^1000^0 北京^1000^2' order by score desc
这里要说的有很多,单词分量后面跟的参数^1000^0 含义如下,第一个参数表示这个单词分量的权值,这里为1000。第二个参数表示这个单词分量在输入的被搜索的句子中的其实位置,如这里“你好”的位置为0,”北京“的起始位置为 2.
排列安装score进行排列,这个score是什么呢?这是hubble搜索的一个匹配度进行计算所得出来的分数。这个分数是根据hubble所独有的算法,这个算法我就不再多说了,有兴趣的同学可以自己去研究一下,我之前说过lucene逐渐被hubble取代,跟这个算法也是有关系的。hubble的算法是根据lucene算法
升级得来的,所以hubble在搜索的匹配度上要高于lucene。而且在速度上来说,我测试了5万次,所得的结论是hubble要比lucene稍微快一点,当然,我测试的也是很片面的,只是使用一个关键词进行搜索,没有多词搜索。
hubble对多个词进行批评语句:select * from News where title^2 match '你好^1000^0 北京^1000^2' or content match '你好^1000^0 北京^1000^2' order by score desc .这个语句跟前面差不多,相信一看就能明白。
相信你也会用hubble+sqlserver了。过些天在写hubble+mongodb吧