.net站内搜索hubble.net使用详解之安装使用
2021-12-01asp.net站内搜索实现Hubble.net的应用说明,hubble.net是开源的,但是由于作者工作问题不在开发维护,但是作为站内搜索我觉得够用,本文用的所有程序下面提供下载。
1)安装
1.1 打开hubbledotnet_1.2.0.0_setup目录双击exe进行软件安装,安装需要注册(这一步当初作者是为了统计安装报表用,现在不维护这个key生成文件程序已经开源),打开generatekey文件夹的exe,随便输入一个邮箱点击生成会生成对应的key,安装完之后找到服务hubble.net点击停止,复制default.rar中所有文件到安装目录default下覆盖,重新打开hubble.net服务,到此安装结束。
1.2
组件简介
HubbleService.exe
这个程序是hubble.net 的windows 服务进程,这个经常只负责在服务启动时启动 hubbletask ,并在服务关闭时关闭 hubbletask。
HubbleTask.exe
这个程序是 hubble.net 的宿主进程,不运行 hubbleService ,直接运行这个程序,也可以运行hubble.net。这个程序启动后将侦听 TCP 端口,接受从 sqlclient 发来的查询请求,执行并返回结果给 sqlclient。
Hubble.Core.dll
这个是Hubble.net 的核心算法库,所有的搜索和索引算法都由这个库提供
Hubble.Framework.dll
这是 hubble.net 的平台库,提供一些公用的类和方法。
Hubble.Analyzer.dll
这个库定义了分词器的接口,并提供几个默认的分词器。
Hubble.SQLClient.dll
这个库是 hubble.net 的SQL 访问客户端,其作用和System.Data.Sqlclient 类似。这个库可以由应用软件调用。
QueryAnalyzer.exe
这个程序是Hubble.net 提供的查询分析器,它主要负责提供图形化的管理和查询功能。
2):应用 找到安装目录打开default/QueryAnalyzer.exe,进入软件界面,server name可以选择127.0.0.1点击登录即可,也可以用远程服务器上的hubble.net,输入远程IP,用户名密码,登录之后进入软件界面首先点击help->about看下是不是最新的
2.1创建数据库 hubble.net默认支持sqlserver,orcle8i,不过如果按照本文步骤下载文件安装(安装文件文末提供),创建数据库的时候另外支持mysql,mongodb,在左边点击服务器右键create database,database name填写为数据库名称,Default DB Adapter选择对应的数据库类型,本文基于mysql 所以填写如下server=127.0.0.1;user id=root; password=; database=mcm; Port=3306;pooling=true;charset=utf8; 这是本机数据库,当然可以选择远程的数据库链接,点击create创建数据库成功。
2.2 创建表 选择刚创建的数据库右键create table 填写表名进入下一步,index model选择第二个从现有表选择,在 Incremental Mode 这里有两个选项
Updatable 和 Append only 的共同点都是被动模式建索引,其区别在于采用 Updatable 模式为数据库现有表建立的全文索引可以添加,修改和删除,而
Append only 模式只能做添加和删除(Append only 模式删除不能自动,要通过程序来删除),不能修改。Updatable 模式索引同步要比 Append only 复杂很多,所以如果你的表只是进行添加和删除操作,没有修改操作,建议用 Append only 模式,否则用 Updatable 模式。
Append Only 模式适用于数据只增长,不修改的模式,实际上在这种模式下只要全文索引字段不被修改就可以适用。这种模式的优点是相对 Updatable 模式消耗的内存要少,速度稍快一些。如果要用这种模式,关系数据库中对应的数据表或视图必须要有一个 DocId 字段,这个字段上必须要有唯一性索引(最好是聚集索引),而且要是自增长的,或者至少要保证后面插入的比前面的大。
Updatable 模式(通常使用这个),这种模式可以实现添加,删除和修改,内存占用比前一种方式要大一些(每条记录多4个字节)。这种模式下关系数据库中对应的数据表或视图中不能有名为 DocId 的字段,但必须有要有一个int 类型的 id 字段,id 字段的名字可以是除“DocId”外的任意名字。
点击下一步进入表结构界面,先介绍hubble.net 数据类型
HubbleDotNet 目前版本支持如下数据类型:
Int, TinyInt, SmallInt, BigInt, Float, DateTime, SmallDateTime, Date, NVarchar, Varchar, NChar, Char
DateTime 的范围和 .net 的 DateTime 类型相同,精度为毫秒。
SmallDatetime 的范围从 1980 年 1月 1日 到 2047 年 12 月 31 号 23:59:59 ,精度为 秒
Date 的范围从 0001 年 1 月 1 日 到 5883516 年 1 月 1 日,精度为天
nvarchar, varchar, nchar, char 这四种类型和SQL SERVER 2005 的四种类型对应,可以指定字符串的长度或者用 max 指定为不限长度的字符串类型。
如果用上述类型做 Untokenized 索引,则长度最大为32.
Int, TinyInt, SmallInt, BigInt, Float 这几种类型和SQL SERVER 2005 的相应类型对应,这几种类型只能指定为 None 或 Untokenized 索引,不能指定为Tokenized 索引。
字段名的定义和T-SQL 类似,如果为关键字,用单引号来指定,如 'where' 。
索引类型
Hubble.net 提供三种索引类型
Tokenized 索引
Tokenized 索引是全文索引类型,只有字符串类型字段才可以指定为 Tokenized 索引。字段被指定为这种索引类型后,索引时将首先对字段中的文本进行分词,然后对分词结果构建倒排索引。搜索这些字段时将查询倒排索引,找到对应的记录。
Untokenized 索引
Untokenized 索引是单值索引,所有数据类型都可以指定为这种类型索引。字段被指定为这种索引类型后,索引时将对字段中的数据构建单值索引,并存放到 Payload.db 这个文件中。这种索引只有在同时搜索全文和元数据时才会使用,比如搜索全文的同时要求搜索时间或对时间进行排序,这时会用到单值索引。
None 索引类型
如果一个字段的索引类型被指定为 None ,Hubble.net 将不对这个字段创建索引。如果搜索条件中包含这种索引类型的字段,hubble.net 将利用关系数据库本身的索引进行查询,索引如果需要对 None 类型字段进行搜索,需要考虑在关系数据库对应的表中创建合适的索引。
根据索引类型来,我们这个表需要根据标题查询,根据类别分类,索引选择情况如下图,id和type选择untokenized,标题选择tokenized 分词器选择盘古分词,IDField填写id点击下一步,进入到sql创建页面,点击下一步点击start开始创建索引
全文索引建立完以后,我们可以优化一下,如下图所示
优化完以后,就可以搜索了。(不优化也可以搜索,性能会慢一些)
查看查询方法使用详解 查询字符串带着权重位置信息,如果查询发现出现不相干的可以去掉权重和位置信息之保留搜索词语比如 ‘中国 软件’
查看同步操作 一般同一个数据库只需要在主表添加触发器添加数据到搜索辅助表,然后再用hubble.net的任务计划即可,如果不同数据库可以先把表同步到服务器然后再添加触发器任务计划,详情参考同步操作
程序调用:
string keywords = "你好"; string TableName = "cms_search"; string searchfiled = "keywords"; string strsql = string.Empty; string strsqlclass = string.Empty; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); DataSet ds = new DataSet(); using (HubbleAsyncConnection conn = new HubbleAsyncConnection("Data Source=127.0.0.1;Initial Catalog=51tools;Integrated Security=True")) { conn.Open(); GetAnalyzerName(conn, TableName, searchfiled); string wordssplitbyspace; HubbleCommand matchCmd = new HubbleCommand(conn); string matchString = matchCmd.GetKeywordAnalyzerStringFromServer(TableName, searchfiled, keywords, int.MaxValue, out wordssplitbyspace); HubbleDataAdapter adapter = new HubbleDataAdapter(); if (string.IsNullOrEmpty(sortBy)) { sortBy = "Score desc"; } strsql = "select between @begin to @end aid from " + TableName + " where " + searchfiled + " contains @matchString and IsDel=0 order by " + sortBy; adapter.SelectCommand = new HubbleCommand(strsql, conn); adapter.SelectCommand.Parameters.Add("@begin", (pageNo - 1) * pageLen); adapter.SelectCommand.Parameters.Add("@end", pageNo * pageLen - 1); adapter.SelectCommand.Parameters.Add("@matchString", matchString); adapter.SelectCommand.CacheTimeout = CacheTimeout; sql = adapter.SelectCommand.Sql; ds = new System.Data.DataSet(); HubbleCommand cmd = adapter.SelectCommand; ds = cmd.Query(CacheTimeout);//查询结果 } recCount = ds.Tables[0].MinimumCapacity;//记录数 elapsedMilliseconds = sw.ElapsedMilliseconds;//消耗时间 sw.Stop();
软件下载
链接:https://pan.baidu.com/s/1MqnT1hFlp08D4uetaKQ1IA
提取码:qdvk
参考
HubbleDotNet开源全文搜索数据库项目--技术详解 - eaglet - 博客园 (cnblogs.com)