开源搜索引擎HubbleDotNet图解之基础使用
一、HubbleDotNet简介
二、HubbleDotNet的下载安装以及升级
三、HubbleDotNet的使用
四、HubbleDotNet的常见问题及解决方法
一、HubbleDotNet简介
HubbleDotNet是基于.net平台下开发的一款免费的数据库全文搜索引擎,为开源项目(开源协议是Apache2.0)。作者eaglet(肖波)有10多年的底层开发经验,非常熟悉Lucene等搜索引擎架构,曾开发过多款Lucene.net平台下的中文分词组件如大名鼎鼎的盘古分词。其HubbleDotNet项目经过两年多的潜心开发,目前最新版本是0.9.5.0,别看版本号小,但已非常完善了。
目前的一些主流数据库都提供了FullText Search(全文搜索)功能,但其全文搜索的功能相对较弱,对于中文的搜索效果不理想,无法很好的满足实际应用需要,而一些全文搜索组件,比如比较著名的Lucene,则只提供了全文搜索功能,而缺乏和关系数据库的关联,且Lucene.net的索引文件的更新和维护很不方便,删除+重新添加=更新的索引修改方式非常糟糕。HubbleDotNet是集全文搜索和关系查询于一体的新型“数据库”系统,用户可以方便的通过SQL语句对Hubble的“数据库”(即索引库)进行全文搜索或关系查询甚至全文+关系的查询。
如何您对数据库自带的全文搜索功能不满意或对Lucene.net的索引维护感到力不从心的时候,您真的应该尝试使用HubbleDotNet来构建您的全文搜索。
二、HubbleDotNet的下载安装以及升级
写稿时HubbleDotNet项目网站上提供正式安装版是0.8.3.0的,需要另外下载的最新版(如0.9.5.0)的项目源文件,本地编译一下获取最新组件,覆盖到0.8.3.0的安装目录下完成升级。
项目网址:http://hubbledotnet.codeplex.com/(不要以为是英文的就是老外的东东哦,^_^)
0.8.3的安装程序下载地址:http://hubbledotnet.codeplex.com/releases/view/44680
目前最新的0.9.5的源文件下载地址:http://hubbledotnet.codeplex.com/SourceControl/list/changesets
安装步骤:
(一)下载HubbleDotNet0.8.3
(二)安装HubbleDotNet0.8.3
获取Key的注册地址为:http://www.hubbledotnet.com/key.aspx
获取Key只要输入一个电子邮箱和姓名,Key就会即时发送到您的邮箱——作者只为统计使用人数而已。邮箱推荐使用google的或qq的,收信速度很快,163邮箱的我等了好久都没收到:(
然后是常规的选择安装目录一路Next就可以了。
(三)安装完成后可以先打开Hubble.net的控制台看一下,控制台界面非常简洁。
(先弹出Connect to Server对话框输入127.0.0.1即可)
是不是有点像SqlServer数据库的管理器啊,呵呵,左边区域显示的就是Hubble的“数据库”,你以后就在那里进行添加管理HubbleDotnet“数据库”的(嗯,其实就是索引库了,类似Lucene.net的索引文件,Hubble的将索引文件以库-表的结构形象的在控制台展示出来方便操作;右上Execute区域是SQL命令输入区,右下Results为搜索结果显示区。
(四)升级HubbleDotNet到最新版本
1.下载HubbleDotNet最新项目源代码程序回来自己编译得到编译组件。
2.停止本机上Hubble.net服务(hubble装上后就在本机上注册一个系统服务了,服务名就叫Hubble.net)
3.覆盖最新版的编译组件到0.8.3.0的安装目录的Default子目录下
4.重新启动本机Hubble.net服务
下面是各个步骤的图解:
打开http://hubbledotnet.codeplex.com/SourceControl/list/changesets去下载最新的Source Code
解压缩后进入HubbleDotNet-xxxx/C#/src/目录下使用vs2008打开解决方案Hubble.Net.sln
使用vs2008打开后将解决方案的编译模式从Debug模式改为Release模式,生成解决方案后,会在HubbleDotNet-xxxx/C#/Bin/目录得到最新组件的编译结果,全部拷贝到刚才0.8.3.0的安装目录的Default子目录下覆盖即可(先停止系统的Hubble.net服务)
升级后别忘了重新开启系统Hubble.net服务。打开HubbleDotNet控制台,点击菜单Help—》About查看最新的版本Hubble版本号检查升级是否成功。
三、HubbleNet的使用
(一)在控制台中操作
1.创建Hubble数据库(索引库)
现在我机上装的是SqlServer2008,里面事先已有一存储大量新闻的数据库News(如下图),现在我要新建一个Hubble索引库与这个News数据库绑定以便全文搜索
下面开始了:
打开HubbleDotNet控制台程序,右键点击根节点,选择CreateDatabase(新建数据库)菜单
弹出新建索引库对话窗口
Database Name(索引库名称):填写您要新建的Hubble库的名称(可以和SqlServer系统中数据库名相同也可以不同)如:HubbleNews
Default Index Folder(索引存储目录路径):在这里填写新建的Hubble索引库的存放位置,如d:TestHubbleNews
Default DB Apapter(数据库适配器):在这里选择你机器上的数据库系统类型,有SQLSERVER2000、SQLSERVER2005、Oracle8i三种可选,看你机上装的是哪种数据库系统选择不同的适配器。(注:SQLSERVER2005适配器适用于微软SqlServer2005及其以后的数据库系统)
Default DB Connection String(数据库连接字符串):连接到你机上数据库系统的数据库连接字符串,如:Data Source=(local);Initial Catalog=News;User ID=xxx;Password=xxx
点击Test DB Connection String(测试数据库连接)按钮看看Hubble系统能否正确连接到数据库系统,弹出Connection Successful!信息表示连接成功,否则出现错误信息。
最后点击Create按钮就创建Hubble库了,Refresh刷新一下就能看到,这样这个新建的Hubble索引库HubbleNews与数据库News就算是绑定了。(这里要注意Hubble索引库有时候大家也称作“数据库”,不要和真正的SqlServer数据库概念搞混了)。
好了,刚才建立的Hubble索引库内还没有任何内容,接下来就要对该索引库里面添加Hubble的“表”,这个“Hubble表”与数据库的表又是什么关系的,看图边说。
在新建的HubbleNews这个索引库上右键菜单中选择Create Table项
弹出Create Table对话框
Table Name(表名):填写将要新建的Hubble表的名称,因我要和数据库News里的dob.News表绑定,如:hubbleNewsTable
Index Folder(索引文件存储位置):表的存储目录
DB Adapter(数据库适配器)和DB Connection String(数据库连接字符串)就不再赘述了!
最后点击Next按钮即可进入一下对话界面:
接下来在设置IndexMode和IncrementalMode等信息
(1)IndexMode(索引模式)下有两个选择:
Build Index in new table:在这种模式下,新建一张hubble表,你再到SqlServer中看下,数据库中会自动添加一张表,删除这个索引表,数据库中的对应表也自动没有了,这是为什么?这种模式也叫IndexOnly=true模式,数据库是被Hubble主动控制的,我们只要操作Hubble,Hubble自动去操作对应的数据库。(这模式我一般用的少)
Build Index from exist tale:顾名思义,是根据数据库中一张已存在的数据库表来建立索引。这个模式也叫IndexOnly=false模式。若选择此模式,下面会出现Exist Table Name or View Name输入框,要你填写已存在的要将索引的数据库中表名或视图名。此模式符合我当前的要求,因为我就是要为数据库News中的News这张表建立索引的,故我填上数据库中表名News。
(2)IncrementalMode这里主要是选仅是增加索引还是需要增改删的全部功能,这里一般都选择下面的Append,Delete,Update,除非你的记录只增不该,那你就选第一个Append Only。
然后点击Next到下一步
在这里设置索引表的字段和存储类型
默认情况下是它是将该数据库表的所有字段都列出来,当然如果您的数据库表有的字段不参与查询和查询那完全可以移去(选中该字段前面的Checkbox,然后点击Delete按钮即可移去一个字段),这里主要要介绍一下字段的IndexType类型,分三种:
(1)Tokenized即分词索引模式,选择Tokenized后,需要指定后面的分词器Analyzer类型(有英文分词,中文分词,盘古分词)
(2)UnTokenized即不分词但索引的模式:比如日期、数字之类的不需要分词但需要建索引
(3)None表示不分词也不索引,这适合一些字段仅需要对字段值进行存储以便数据查询时提供显示。
别忘记填写ID Fileld:指定哪个字段为自动编号字段(需要在数据库中指定该字段值是自增的)。
点击Next下一步后最后出现Rebuild Table对话框创建索引
点击Rebuild按钮即可对当前索引表内的数据重建索引数据了。
RebuildWholeTable意思是是否对整张表重新建立索引
DocId from意思是从索引编号多少开始建立索引
2.建立Hubble库后进行搜索查询
在控制台中输入SQL语句进行搜索查询,非常方便
查询语法示例:
select * from HubbleNewsTable
select top 10 * from HubbleNewsTable
select * from HubbleNewsTable where Title match '北京天安门' (模糊搜索标题title)
select * from HubbleNewsTable where Title contains '北京天安门' (精确搜索标题title)
select * from HubbleNewsTable where Title contains '北京天安门' and NewsContent match '北京天安门' (精确搜索标题title同时模糊搜索内容NewsContent)
其他的自己看demo了,当然FSQL和标准的SQL也并不是完全100%一致的,比如这样不行select * from [HubbleNewsTable]
(二)在程序中使用HubbleDotNet
这里大家主要可以参考从HubbleDotNet源码中的Demo了,我贴几段代码大家看了就会明白。
using PanGu;
using Hubble.Framework;
using Hubble.Core;
using Hubble.Analyzer;
using Hubble.SQLClient;
//....添加一个记录到Hubble表中
public static bool InsertIndex(SCH.Model.News News)
{
string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"];
string hubbleSql = "insert hubbleNewsTable ([ID],[title],[newscontent]) values (@ID,@title,@newscontent)";
int flag=0;
using (HubbleConnection conn = new HubbleConnection(ConnectionString))
{
conn.Open();
HubbleCommand matchCmd = new HubbleCommand(hubbleSql, conn);
matchCmd.Parameters.Add("@ID", News.Id);
matchCmd.Parameters.Add("@title", News.title);
matchCmd.Parameters.Add("@newscontent", News.newscontent);
flag = matchCmd.ExecuteNonQuery();
}
return (flag > 0) ? true : false;
}
同理删除用delete语句,修改用Update语句差不多的。
需要提一下:
如果是IndexOnly=false模式下
添加数据:先添加记录到数据库,在添加记录到Hubble索引库。
删除数据:先删除Hubble索引库中记录,在删除数据库中记录。
更新记录:顺序无所谓。
也就是在IndexOnly=false模式下,你要通过程序对两边都要操作。
四、HubbleDotNet的常见问题及解决方法
常见的问题和解决方法可以估计要放到另外一篇文章中继续了,先提供大家eaglet的博客园的小组地址:http://home.cnblogs.com/group/search/
去那里可以找到人家已经问过的许多问题和eaglet本人的解答。