zoukankan      html  css  js  c++  java
  • DNN中搜索引擎原理(数据库分析) dodo

    DotNetNuke(以下简称DNN)中所采取的搜索方式,并不是我们通常所想象的直接再要查询的表中直接搜索。因为DNN中的模块是多种多样的,各数据表的形式和要查询的字段也是不一样,如果直接查询每一个表的内容是几乎不可能实现的。DNN中引入了一个SearchItem表,将各种各样的需要查询的内容,归结为查询条目的形式添加到该表中。同时还引出了一个SearchWord表,将需要查询的内容分解成一个个关键字,这样更能加快检索速度,而且还利于多关键字检索。在DNN搜索中还有一个小技巧:可以通过“key1 key2的形式进行多关键字检索,并且可以通过“key1+ key2-”形式明确指出是否必须保含某关键字,是否必须排除某关键字。

    整个和搜索相关表的关系图如下:

    从关系图上来看,只要在SearchWord表中找到指定关键字,通过SearchItemWord表,就能知道要查询的内容了。通过SearchItem表,就能确切知道是哪个模块了。

    各表个字段的详细解释:

    SearchCommonWords常用字/词组信息表(存储指定文化区域的常用字,在查询时输入这些字是不会返回结果的)

    字段名

    类型

    含义

    备注

    CommonWordID

    Int

    常用字ID

    主键

    CommonWord

    Nvarchar(255)

    常用字

    如:whereabout在英文中都属于常用字

    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搜索引擎原理。上文有任何讲解不正确的地方还请大家指出,以免误导他人。

  • 相关阅读:
    随堂练习 磁盘管理文件系统
    随堂练习 shell脚本(二)
    随堂练习 软件包管理
    随堂练习 压缩和解压缩
    随堂练习 文本处理小工具
    随堂练习 用户和组的权限管理
    随堂练习 bash shell特性和I/O重定向及管道
    随堂练习 Linux 文件管理
    随堂练习 linux 基础知识
    C连载13-复数类型以及基本数据类型总结
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/464042.html
Copyright © 2011-2022 走看看