整个和搜索相关表的关系图如下:
从关系图上来看,只要在SearchWord表中找到指定关键字,通过SearchItemWord表,就能知道要查询的内容了。通过SearchItem表,就能确切知道是哪个模块了。
各表个字段的详细解释:
SearchCommonWords:★常用字/词组信息表(存储指定文化区域的常用字,在查询时输入这些字是不会返回结果的)
字段名 | 类型 | 含义 | 备注 |
CommonWordID | Int | 常用字ID | 主键 |
CommonWord | Nvarchar(255) | 常用字 | 如:where,about在英文中都属于常用字 |
Locale | Nvarchar(10) | 所属文化区域 |
|
SearchIndexer:★索引Provider的程序集(这个表的数据好像没有用,在web.config中有设置)
字段名 | 类型 | 含义 | 备注 |
SearchIndexerID | Int | ID | 主键 |
SearchIndexerAssemblyQualifiedName | Char(200) | 程序集 |
|
SearchItem:★模块内容搜索条目(将所有可能被搜索到的模块内容,通过定时调度的方式,将模块内容以搜索条目的形式保存,这样可加快搜索速度)
字段名 | 类型 | 含义 | 备注 |
SearchItemID | Int | 搜索条目ID | 主键 |
Title | Nvarchar(200) | 标题 |
|
Description | Nvarchar(2000) | 描述 |
|
Author | Int | 作者Id |
|
PubDate | Datetime | 发布日期 |
|
ModuleId | Int | 所属模块Id | 与模块信息表(Modules)关联 |
SearchKey | Nvarchar(100) | 搜索关键字 |
|
Guid | Varchar(200) |
| 好像是指示模块中的一条记录 |
HitCount | Int | 点击次数 |
|
ImageFileId | Int |
|
|
SearchItemWord:★搜索关键字索引信息表(搜索条目和搜索关键字之间的关系)
字段名 | 类型 | 含义 | 备注 |
SearchItemWordID | Int | 搜索关键字索引ID | 主键 |
SearchItemID | Int | 搜索条目Id | 关联模块内容搜索条目表(SearchItem) |
SearchWordsID | Int | 搜索关键字Id | 关联搜索关键字信息表(SearchWordsID) |
Occurrences | Int | 出现次数 | 关键字在指定搜索内容中的出现次数 |
SearchItemWordPosition:★搜索关键字在被搜索内容中出现的位置
字段名 | 类型 | 含义 | 备注 |
SearchItemWordPositionID | Int | ID | 主键 |
SearchItemWordID | Int | 搜索关键字索引ID | 关联搜索关键字索引信息表(SearchItemWord) |
ContentPosition | Int | 出现位置 |
|
SearchWord:★搜索关键字信息表(存储可供检索的关键字)
字段名 | 类型 | 含义 | 备注 |
SearchWordsID | Int | 搜索关键字ID | 主键 |
Word | Nvarchar(100) | 搜索关键字 |
|
IsCommon | Bit | 是否是常用字 |
|
HitCount | Int | 点击次数 |
|
一个可以改进的存储过程:
查看获取查询结果的存储过程GetSearchResults,我们会发现必须完全匹配查找关键字才能查出所需的内容。问题就在“sw.Word = @Word”这一句上,也就是说如果一个模块中包含“DotNetNuke”这个内容,那么他输入“Nuke”是不会查出来的。将这一句改成“sw.Word like '%' + @Word+'%'”就可以了(这是一个以效率换结果的方法)。具体修改方法见:http://www.cnblogs.com/esshs/archive/2005/08/12/213154.html
从数据表和所实现的功能上看,某些表的数据字段还没有用上,估计是DNN预留字段以便日后扩充。看完这篇文章的不知大家对DNN的查询功能是否有一个大概的了解。以后将继续针对如何通过各功能模块所实现的查询接口来填充SearchItem表;点击“查询”是如何工作的这些方面的问题来继续说明DNN搜索引擎原理。上文有任何讲解不正确的地方还请大家指出,以免误导他人。