开源搜索引擎HubbleDotNet图解之基础使用

开源搜索引擎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:\Test\ HubbleNews

Default DB Apapter(数据库适配器):在这里选择你机器上的数据库系统类型,有SQLSERVER2000、 SQLSERVER2005、Oracle8i三种可选,看你机上装的是哪种数据库系统 选择不同的适配器。 (注:SQLSERVER2005适配器 适用于微软SqlServer2005及其以后的数据库系统)  

Default DB Connection String(数据库连接字符串):连接到你机上数据库系统的数据库连接字符串,如: Data Source=(local);Initial Catalog= Ne ws ;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到下一步

在这里设置Hubble索引表中的字段和分词及存储类型

默认情况下是它是将该数据库表的所有字段都列出来,当然如果您的数据库表有些字段不参与查 询和搜索那完全可以移去(选中该字段前面的Checkbox,然后点击Delete按钮即可移去一个字段),这里主要要介绍一下字段的字段的 IndexType索引类型,分三种:

(1)Tokenized即分词索引模式,选择Tokenized后,需要指定后面的分 词器Analyzer类型(有英文分词,中文分词,盘古分词)

(2)UnTokenized即不分词但索引的模式:比如日期、数字之类的不需要分词但 需要索引

(3)None表示不分词也不索引,这适合一些字段仅需要对字段值进行存储以便数据查询 时提供显示。

别忘记填写ID Fileld:指定哪个字段为自动编号字段(需要在数据库中指定该字段值是自增的)。

点击Next下一步后最后出现Rebuild Table对话框创建索引

 

点击 Rebuild按钮即可对当前索引表内的数据重建索引数据了。

RebuildWholeTable 意思是是否对整张表内的所有记录重新建立索引

DocId from意思是从索引编号多少开始建立索引

 

2. 建立Hubble库后进行搜索查询

 

在控制台 中输入SQL语句点击Execute按钮进行搜索查询,非常方便

查询语句 示例:

select * from HubbleNewsTable

select top 10 * from HubbleNewsTable

select * from HubbleNewsTable where Title match 'XX门 事件 '    (模糊搜索标题title)

select * from HubbleNewsTable where Title contains 'XX门 事件 '    (精确搜索标题title)

select  * from HubbleNewsTable where Title contains 'XX门事件' and NewsContent match 'xx门 事件 '    (精确搜索标题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语句差不多的。

搜索查询使用select语句返回数据集可以看看 源码中的demo。

需要提一下:

如果是IndexOnly=false模式下

添加数据:先添加记录到数据库,再添加记录到Hubble索引库。

删除数据:先删除Hubble索引库中记录,再删除数据库中记录。

更新记录:顺序无所谓。

也就是在IndexOnly=false模式下,你要通过程序对两边(数据库和 Hubble索引库)都要操作以维持记录同步。

四、HubbleDotNet的常见问题及解 决方法

常见的问 题和解决方法可以估计要放到另外一篇文章中继续了,先提供大家eaglet的博客园的小组地址: http://home.cnblogs.com/group/search/
去那里可以找到人家已经问过的许多问题和eaglet本人的解答。

你可能感兴趣的:(数据结构,sql,.net,搜索引擎,Lucene)