我们通常在站内搜索应用时,通过sql语句的like方法进行模糊搜索,当你的数据量不多了,这种方法一点问题都没有,但当你的数据量增加到数十万或数百万以上时,你会明显感觉你的数据库性能急剧下降。本文将为你推荐一款开源的搜索引擎框架HubbleDotNet,并结合笔者的使用经验,分享一些实际应用中的实践。
一、HubbleDotNet简介
HubbleDotNet 是一个基于.net framework的开源免费的全文搜索数据库组件。HubbleDotNet提供了基于SQL的全文检索接口,使用者只需会操作SQL,就可以很快学会使用HubbleDotNet进行全文检索。 HubbleDotNet可以实现全文索引和查询、多域检索和排序、分组统计、消重、分类、聚类、多表关联查询等等一系列全文检索和数据挖掘功能。 HubbleDotNet提供开放的数据库适配器接口,可以和各种数据库完美整合,为各种数据库系统附加全文检索和数据挖掘功能。 HubbleDotNet设计了较为完善的并发控制程序,数据的增删改查可以多线程同时并发进行,没有任何冲突。HubbleDotNet还进行了缓存和内存管理设计,可以帮助用户最大限度的提高查询的效率。
二、安装
首先下载安装文件,下载地址:http://hubbledotnet.codeplex.com/releases/view/84497
根据您的机器硬件类型运行下面安装程序中的一个
x86/setup.exe
x64/setup.exe
IA/setup.exe
运行安装包
上图欢迎界面
注册
选择安装目录
至此安装完成,在你的安装目录下可以看到以下文件
接下来要做的事很重要,这对于能否很好的使用lubble.net及盘古分词起着很大的作用
三、维护盘古分词词库字典
进入default目录
Hubble.net默认自带盘古中文分词器,以上红框部分就是盘古分词器组件,其中Dictionaries目录用来存放盘古分词的字典文件,如下图
主分词词库字典文件为Dict.dct,前面三个文件为中文人名字典文件,Stopword.txt为停用词字典,Synonym.txt为同义词字典文件。在你创建hubble数据库和数据表之前,你应该先维护好这些分词字典,否则等到你把几十万数据的索引生成好后,发现你的分词词库不适应你的搜索要求,你得重新更新词库并得重新生成索引,这将是很耗时的。虽然盘古分词器已经自带了几十万条常用中文分词词典,但并不是全面的,你得根据你网站应用的行业特点增加相关的词库。
主分词词库字典的维护
上上图中的DictManage.exe是维护分词字典的管理小工具,支持批量添加
文件下拉菜单》打开,选择Dict.dct文件
根据你的需要添加修改分词词库,最后注意要保存。分享一个本人收集常用词库的小方法,
就是利用搜狗拼音的词库
同义词及停用词字典的维护
直接用记事本打开编辑,每组同义词为一行,用逗号隔开
盘古分词的通用属性配置
打开default目录下的Demo.exe
下图是我建议的配置内容。注意,该工具配置后只是修改了default目录下的PanGu.xml配置文件,还有另一个配置文件PanGuSqlClient.xml需要配置。
这两个配置文件分别用于:PanGu.xml用于在建立内容索引时的分词,PanGuSqlClient.xml则对应查询时对查询字符串的分词
四、创建数据库
HubbleDotNet 的数据库只是一个逻辑概念,设计这个逻辑概念的目的是为了便于对一些具有类似属性的数据表进行管理。HubbleDotNet中并没有数据库这个实体,数据库在HubbleDotNet中可以被理解为一个数据表的管理群组。HubbleDotNet中的数据表必须归属于一个数据库,并在默认配置时继承所属数据库的公共属性
Hubble.net 提供的查询分析器 QueryAnalyzer工具可以很方便的创建数据库。下面给出创建数据库的步骤
运行 QueryAnalyzer,进入登录界面,输入要登录服务器的地址(可为远程主机地址)
如上图所示,在服务器节点点右键并选择 CreateDatabase ,这时出现如下界面
如上图所示,在这个界面中,我们需要指定
数据库的名称
默认的索引目录。这个目录将用于存放数据库中数据表的配置文件、索引文件、缓存等数据
默认的数据库适配器。关于数据库适配器的相关介绍参见数据库适配器一章。
默认的数据库连接字符串。这个连接字符串是hubble.net数据表对应的关系数据库的连接字符串。hubble.net查询时会通过这个连接字符串来连接关系数据库,并获取相应数据。指定好这个连接字符串后,你还可以点击下面的 Test DB Connection String按钮来测试这个连接字符串是否可以工作。连接字符串可以指定本机的数据库,也可以指定远程数据库。
完成上面的操作后,点击 Create按钮,创建数据库就完成了。如下图所示,创建完后,界面上将出现一个News数据库。
五、创建表
HubbleDotNet 可以非常方便的对数据库现有表或视图创建全文索引。创建好HubbleDotNet的数据库后就可以开始对关系数据库中现有表或视图建全文索引了。下面我以Test库的EnglishNews表为例,讲解如何针对现有表创建全文索引。
这是SQL SERVER的 Test库中 EnglishNews 表的结构
如上图所示点击Create table后会出现这个界面,按照界面提示,输入HubbleDotNet的表名,这里输入EnglishNews,这个名字不一定要和数据库的名字相同。
再输入全文索引所在目录,选择数据库适配器,这里由于我对应的关系数据库是SQLSERVER 2005,所以选SQLSERVER2005,这个适配器适用于
SQL SERVER2005 及以后的所有版本。然后再配置一下关系数据库的连接字符串,这个连接字符串用户和对应的关系数据库连接,如果需要连接远程数据库,
只需要在这里指定Data Source =远程IP地址就可以了。点下面的Test DB Connection String按钮测试连接字符串没有问题,点Next进入下一步。
注意选择Incremental Mode为Updatable,否则以后索引建好后只能添加不能更新
Exist tableName or View Name 这里输入数据库中对应表的表名,这里输入 EnglishNews。由于HubbleDotNet不但可以对现有表做索引,
也可以对视图做索引,所以如果被索引的不是表而是视图,只要在这里填写数据库中对应的视图名就可以了。
由于这个表不但要添加删除,还要修改,这里我们选择增量模式为 Updatable模式。
点Next进入下一步
如上图所示,HubbleDotNet会自动从数据库中读取表结构,帮助用户生成索引表结构。
Updatable 类型索引,数据库的现有表必须有一个Int或 Bigint类型 Id字段(ID Field)这个字段的字段名可以为除DocId以外的任意名字。
这个字段必须设置为Untokenized索引类型。这个字段必须是自增长的。
如果被索引的表的主键不是int或bigint类型,比如vchar类型字段做主键,那么我们必须在被索引表中插入一个int类型或bigint类型的自增长字段,
并为这个字段建唯一性索引,然后将 ID Field指向这个字段才行。
设置完所有字段后,点击下一步
这一步列出创建语句,你可以做最后的检查,如果确认没有问题,点Finish。建表语句如下,你也可以不通过建表界面,直接写建表语句来建立索引表。
[IndexOnly]
[DocId('Id')]
[Directory('d:\test11\EnglishNews\')]
[DBTableName('EnglishNews')]
[DBAdapter('SQLSERVER2005')]
[DBConnect('DataSource=(local);Initial Catalog=Test;Integrated Security=True')]
Createtable EnglishNews
(
IdBigInt UntokenizedNULLdefault 0 ,
GroupIdInt UntokenizedNULLdefault 0 ,
SiteIdInt UntokenizedNULLdefault 0 ,
TitleNVarchar(max) Tokenized Analyzer'EnglishAnalyzer'NULLdefault'' ,
ContentNVarchar(max) Tokenized Analyzer'EnglishAnalyzer'NULLdefault'' ,
Time DateTime UntokenizedNULLdefault'1900-1-1' ,
URLNVarchar(max)NULL ,
ImageUrlNVarchar(max)NULL
);
这时将提示
如果你打算马上就开始索引,选 Yes
这时将进入 Rebuild Table界面
点Rebuild就可以开始为EnglishNews这个现有表创建全文索引了。
六、生成索引
如果上一步你没有选择立即Rebuild Table,没关系,还可以在查询分析器里选择当前表,右键》Rebuild Table,生成表索引文件,生成完成后,查看d:\test11\EnglishNews 目录,目录下已经生成好几个.idx和.ddx文件,说明索引已经创建成功
七、在自己的项目中添加查询方法开始搜索之旅
在你的项目中添加下图三个引用
分别对应的dll文件在安装目录的default目录下查找
接下来就是开始写查询方法了,还是以上面的EnglishNew为例,查询新闻标题或内容包含关键的列表
代码很简单,和浦东的ADO.NET写法非常相似,就是查询sql语句增加了contains和match关键字,Match方式匹配方式是对指定字段按单词分量或的方式进行匹配,匹配相关度计算中同时考虑单词出现的频率和单词在文章中的位置,Contains匹配是对所有单词分量按与方式进行匹配,但也可以指定某个分量按或匹配,用contains查询出的结果比用match查询的结果要少。
欢迎加入项目管理讨论群:261830264